2012-03-08 22 views
9

tengo ese archivo xml:C#: Modificar un nodo 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> 

Y quiero modificar el InnerText de alarma 1 a otro valor, de modo que escribí ese código que en realidad duplicar todo el nodo.

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

y luego trató de otro código:

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

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

sino también el trabajo doesn `t ....

EDIT 1: [Descubierto un nuevo código]

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

Pero hizo que la alarma1 se convierte en

<MODIFIED /> 

EDIT 2: [Lo resuelto: D] Bueno aquí está el código que podría imaginar:

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

`ll Realmente aprecio su ayuda y gracias.

+0

uso XDocument' ',' no XmlDocument' – Jodrell

+0

sus ejemplos y respuesta seleccionada no tienen nada que ver con LINQ – Jodrell

+0

Si vas con Edit2: pero un 'break;' en 'if' para evitar el bucle innecesario – Jodrell

Respuesta

11

Prueba esto:

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

Su línea foreach es simplemente un bucle a través de una lista de elementos llamados "recordatorios", no es nodos secundarios.

Tome un vistazo a este XPath tutorial para más información:

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

+2

Fue solo el primer recurso que encontré y siempre ha sido una fuente útil para mí en el pasado, ya sea respetada o no. – 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

Si desea utilizar LINQ con XML (me parece que la mejor manera), entonces usted tendrá que usar la System.Xml.Linq espacio de nombres. Las clases en ese espacio de nombres tienen el prefijo X no Xml. La funcionalidad en este espacio de nombres es más nueva, mejor y mucho más fácil de manipular con Linq.

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

Este código le dará una variable, alarm1 que es el recordatorio de que tiene un nodo título de "Alarma 1".

A partir de ese momento, no es claro para mí exactamente lo que desea modificar. Si lo que desea es cambiar el título a continuación ...

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