2016-05-04 35 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