2016-05-04 89 views
0

我正在制作一个程序,该程序从用户处获取信息并将其保存为XML文件。这些信息包括名称和其他详细信息。我希望能够允许用户输入相同的名称,而不是使用相同名称创建新元素,而是使用输入的新值覆盖现有元素。如何覆盖/编辑C#中的XML元素

我希望这是有道理的,但如果我输入约翰史密斯的名字和250岁就不是一个例子。显然我想改变这个错字,所以我会再次输入John Smith, 25岁。当我这样做时,会创建一个新元素来添加另一个John Smith,是否有一种方法可以编辑/覆盖现有元素?如果有任何帮助,我会发布我用来创建XML的代码!

在此先感谢!

XDocument Xdoc = new XDocument(new XElement("XMLFile")); 
     if (System.IO.File.Exists(filepath)) 
     { 
      Xdoc = XDocument.Load(filepath); 
     } 
     else 
     { 
      Xdoc = new XDocument(); 
     } 

     XElement xml = new XElement("Member"); 
     xml.Add(new XElement("Name", txtName.Text)); 
     xml.Add(new XElement("Age", txtAge.Text)); 
     xml.Add(new XElement("Nationality", txtNationality.Text)); 
     xml.Add(new XElement("EmailAddress", txtEmailAddress.Text)); 
     xml.Add(new XElement("ContactNumber", txtContactNumber.Text)); 


     if (Xdoc.Descendants().Count() > 0) 
     { 
      Xdoc.Descendants().First().Add(xml); 
     } 
     else 
     { 
      Xdoc.Add(xml); 
     } 

     Xdoc.Save(filepath); 

回答

0

您可以检索所需元素并使用.Value属性设置它们的值。

请注意,您的代码中有一个很大的错误。当文档初始为空时,将第一个Member添加为文档的根元素,但在此之后,将第一个成员的所有其他Members添加为子元素。

以下是正确的代码来执行更新并正确添加新成员。

XDocument Xdoc; 

if (System.IO.File.Exists(filepath)) 
{ 
    Xdoc = XDocument.Load(filepath); 
} 
else 
{ 
    Xdoc = new XDocument(new XElement("Members")); 
} 

XElement member = Xdoc 
    .Descendants("Member") 
    .FirstOrDefault(m => (string) m.Element("Name") == name); 

if (member != null) 
{ 
    member.Element("Age").Value = age; 
    member.Element("Nationality").Value = age; 
    member.Element("EmailAddress").Value = age; 
    member.Element("ContactNumber").Value = age; 
} 
else 
{ 
    XElement newMember = new XElement("Member", 
     new XElement("Name", name), 
     new XElement("Age", age), 
     new XElement("Nationality", nationality), 
     new XElement("EmailAddress", email), 
     new XElement("ContactNumber", contactNumber) 
     ); 

    Xdoc.Descendants("Members").First().Add(newMember); 
} 

Xdoc.Save(filepath); 
+0

这工作,谢谢! :) – Jamie

0

当然有。当你加载你的XML,创建一个基于该名称是否存在两种作用不同的路径,然后合并的路径返回在保存XML:

XDocument Xdoc = new XDocument(new XElement("XMLFile")); 
if (System.IO.File.Exists(filepath)) 
{ 
    Xdoc = XDocument.Load(filepath); 
} 
else 
{ 
    Xdoc = new XDocument(); 
} 

var existing = Xdoc.Descendants("Member").FirstOrDefault(m => m.Element("Name")?.Value == txtName.Text); 

if (existing != null) //name existed in xml 
{ 
     existing.Element("Age").Value = txtAge.Text; 
     //.... 
     //.... 
} 
else 
{ 
     XElement xml = new XElement("Member"); 
     xml.Add(new XElement("Name", txtName.Text)); 
     xml.Add(new XElement("Age", txtAge.Text)); 
     xml.Add(new XElement("Nationality", txtNationality.Text)); 
     xml.Add(new XElement("EmailAddress", txtEmailAddress.Text)); 
     xml.Add(new XElement("ContactNumber", txtContactNumber.Text)); 

     if (Xdoc.Descendants().Count() > 0) 
     { 
      Xdoc.Descendants().First().Add(xml); 
     } 
     else 
     { 
      Xdoc.Add(xml); 
     } 
} 

Xdoc.Save(filepath)); 
+0

这工作完美,谢谢! – Jamie

0

使用XElement.SetElementValue(element, value)

例子:

xml.SetElementValue("Age", 25); 

另一种方式,你可以去了解这一点,这听起来像在这种情况下,矫枉过正是这样的: 如何第一存储元素的名称和值在一个HashMap,然后迭代通过HashMap并创建XML元素。当有人正在编辑一个值时,逆转这个过程。因此,无论何时进行编辑,都会将元素转储到HashMap中,更新元素值,然后重新创建xml元素。

+0

我一直在寻找通过文本框输入的值,对不起,我应该提到这一点。我已经排序了,不过谢谢! :) – Jamie