2012-03-08 2 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> 

И я хочу, чтобы изменить InnerText от ALARM1 другого значения, так что я написал, что код, который фактически дублирует весь узел.

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

но и Безразлично `работа ....

EDIT 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 /> 

EDIT 2: [I решаемые IT: 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

+0

ваши примеры и выбранного ответа не имеют ничего общего с LINQ – Jodrell

+0

Если вы собираетесь с EDIT2: но «break;» в 'if', чтобы предотвратить незавершенный цикл – Jodrell

ответ

11

Попробуйте это:

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

Ваша foreach линия просто перекручивание через список элементов, называемых «напоминаний», а не его дочерние узлы.

Посмотрите на это XPATH учебнике для получения дополнительной информации:

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

+2

Был только первым ресурсом, к которому я пришел, и всегда был полезным источником для меня в прошлом, независимо от того, уважаемый или нет. – 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

Если вы хотите использовать LINQ с XML (я считаю это лучшим способом), то вы хотите использовать System.Xml.Linq пространство имен. Классы в этом пространстве имен имеют префикс только X, а не Xml. Функциональность в этом пространстве имен более новая, лучше и намного проще манипулировать с Linq.

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

Этот код даст вам переменную alarm1, которая является напоминанием о том, что имеет заголовок узла «ALARM1.»

С этого момента ему не ясно, что именно вы хотите изменить. Если вы просто хотите, чтобы изменить название, а затем ...

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