2012-03-08 22 views
9

tôi có mà tập tin xml:C#: Sửa đổi một nút xml

<?xml version="1.0" encoding="utf-8"?> 
<reminders> 
    <reminder> 
    <Title>Alarm1</Title> 
    <Description>Desc1</Description> 
    <Time>03/07/2012 10:11AM</Time> 
    <snooze>1</snooze> 
    <repeat>None</repeat> 
    </reminder> 
</reminders> 

Và tôi muốn thay đổi innerText từ Alarm1 để giá trị khác vì vậy tôi đã viết rằng mã đó thực sự lặp lại toàn bộ nút.

 XmlDocument xml = new XmlDocument(); 

     xml.Load("0.xml"); 

     XmlNodeList elements = xml.SelectNodes("//reminders"); 

     foreach (XmlNode element in elements) 
     { 
      if (element.InnerText == "Alarm1") 
      { 
       XmlNode newvalue = xml.CreateElement("MODIFIED"); 
       element.ReplaceChild(newvalue, element); 

       xml.Save("0.xml"); 
      } 
     } 

Và sau đó thử mã khác:

 foreach (XmlElement element in xml.SelectNodes("//reminder")) 
     { 
      if (element.InnerText == "Alarm1") 
      { 
       XmlNode newvalue = xml.CreateElement("MODIFIED"); 
       element.ReplaceChild(newvalue, element); 

       xml.Save("0.xml"); 
      } 
     } 

Nhưng cũng làm việc doesn `t ....

EDIT 1: [đặn ra một mã mới]

 XmlDocument xml = new XmlDocument(); 

     xml.Load("0.xml"); 

     foreach (XmlElement element in xml.SelectNodes("//reminder")) 
     { 
      foreach (XmlElement element1 in element) 
      { 
       if (element.SelectSingleNode("//Title").InnerText == "Alarm1") 
       { 
        XmlNode newvalue = xml.CreateElement("MODIFIED"); 
        element.ReplaceChild(newvalue, element1); 

        xml.Save("0.xml"); 
       } 
      } 
     } 

Nhưng nó đã làm cho Alarm1 trở thành

<MODIFIED /> 

EDIT 2: [Tôi giải quyết nó: D] Được rồi đây là đoạn code tôi có thể hình dung ra:

 XmlDocument xml = new XmlDocument(); 

     xml.Load("0.xml"); 

     foreach (XmlElement element in xml.SelectNodes("//reminder")) 
     { 
      foreach (XmlElement element1 in element) 
      { 
       if (element.SelectSingleNode("//Title").InnerText == "Alarm1") 
       { 
        MessageBox.Show(element1.InnerText); 
        XmlNode newvalue = xml.CreateElement("Title"); 
        newvalue.InnerText = "MODIFIED"; 
        element.ReplaceChild(newvalue, element1); 

        xml.Save("0.xml"); 
       } 
      } 
     } 

I `ll thực sự đánh giá cao giúp bạn và cảm ơn.

+0

sử dụng 'XDocument', không phải 'XmlDocument' – Jodrell

+0

ví dụ của bạn và trả lời được lựa chọn không có gì để làm với LINQ – Jodrell

+0

Nếu bạn đang đi với EDIT2: nhưng một 'ngắt;' trong 'if' để ngăn chặn vòng lặp không cần thiết – Jodrell

Trả lời

11

Hãy thử điều này:

xml.SelectSingleNode("//reminder/Title").InnerText = "NewValue"; 

dòng foreach của bạn chỉ đơn giản là vòng lặp thông qua một danh sách các yếu tố được gọi là "nhắc nhở", chứ không phải đó là nút con.

Hãy xem xpath hướng dẫn này để biết thêm thông tin:

http://www.w3schools.com/xpath/xpath_intro.asp

+2

Chỉ là tài nguyên đầu tiên tôi đến và luôn là nguồn hữu ích cho tôi trong quá khứ, dù có tôn trọng hay không. – aaroncatlin

2
XDocument doc = XDocument.Load("0.xml"); 
IEnumerable<XElement> rech = 
        from el in doc.Root.Elements("reminder") 
        where (string)el.Element("Title") == "Alarm1" 
        select el; 
if (rech.Count() != 0) 
{ 
    foreach (XElement el in rech) 
    { 
     el.Element("Title").SetValue("NEW TITLE"); 
    } 
} 
doc.Save("0.xml"); 
3

Nếu bạn muốn sử dụng LINQ với xml (tôi thấy nó là cách tốt nhất) sau đó bạn sẽ muốn sử dụng System.Xml.Linq không gian tên. Các lớp trong không gian tên đó đều được đặt trước chỉ với X không phải là Xml. Các chức năng trong không gian tên này là mới hơn, tốt hơn và dễ dàng hơn để thao tác với LINQ.

var xml = XDocument.Load("0.xml"); 
var alarm1 = xml.Descendants("reminder") 
       .Single(r => r.Element("Title") == "Alarm1"); 

Mã này sẽ cung cấp cho bạn một biến, alarm1 là lời nhắc có nút tiêu đề của "Alarm1".

Từ thời điểm đó, nó không rõ ràng với tôi chính xác những gì bạn muốn sửa đổi. Nếu bạn chỉ muốn thay đổi tiêu đề sau đó ...

alarm1.Element("Title").Value = "MODIFIED"; 
xml.Save("0.xml"); 
2
XDocument xDoc = XDocument.Load(.....); 
xDoc.Descendants("Title").First().Value = "New Value"; 
xDoc.Save(...) 
Các vấn đề liên quan