2012-03-08 118 views
9

我有一個XML文件:C#:修改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> 

,我想修改從報警1的innerText屬性爲其他值,所以我寫的代碼實際上覆制整個節點。

 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"); 
      } 
     } 

然後嘗試另一個代碼:

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

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

而且不`噸的工作....

編輯1:想出了一個新的代碼]

 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"); 
       } 
      } 
     } 

但它使Alarm1變成

<MODIFIED /> 

編輯2:我解決了它:d] 好這裏是我的代碼可以計算出:

 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"); 
       } 
      } 
     } 

我心底非常感謝您的幫助和感謝。

+0

使用'XDocument',不'XmlDocument' – Jodrell 2012-03-08 10:32:40

+0

你的例子和選擇的答案無關的LINQ – Jodrell 2012-03-08 10:55:14

+0

如果您正在使用EDIT2會:但''打破;''在'如果',以防止unesscessary循環 – Jodrell 2012-03-08 10:59:41

回答

11

試試這個:

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

foreach線簡單地通過所謂的「提醒」元素的列表循環,而不是它的子節點。

看看這個XPath教程的詳細信息:

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

+2

只是我過去的第一個資源,無論是否受到尊重,我一直都是我的有用資源。 – aaroncatlin 2012-03-08 12:09:18

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

如果你想使用XML LINQ(我覺得最好的方式),那麼你將要使用的System.Xml.Linq命名空間。該名稱空間中的類都以X而不是Xml作爲前綴。這個命名空間中的功能更新,更好,並且更易於使用Linq進行操作。

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

此代碼會給你一個變量,alarm1那就是有一個標題節點提醒「警報1」。

從這一點來說,我不清楚你到底想要修改什麼。如果你只是想更改標題,然後...

alarm1.Element("Title").Value = "MODIFIED"; 
xml.Save("0.xml"); 
2
XDocument xDoc = XDocument.Load(.....); 
xDoc.Descendants("Title").First().Value = "New Value"; 
xDoc.Save(...)