2012-03-08 15 views
9

ho quel file xml:C#: Modifica di 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> 

e voglio modificare l'InnerText da Alarm1 ad un altro valore così ho scritto che il codice che in realtà duplicare l'intero 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"); 
      } 
     } 

E poi provato un altro codice:

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

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

Ma anche il lavoro doesn `t ....

EDIT 1: [trovato un nuovo codice]

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

Ma ha reso Alarm1 diventa

<MODIFIED /> 

EDIT 2: [ho risolto: D] Ok qui è il codice che riuscivo a capire:

 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 davvero apprezzare vostro aiuto e grazie.

+0

uso 'XDocument', non' XmlDocument' – Jodrell

+0

tuoi esempi e risposta selezionata non hanno nulla a che fare con LINQ – Jodrell

+0

Se si sta andando con EDIT2: ma un 'break;' nel 'if' per evitare che il ciclo nonessessario compaia – Jodrell

risposta

11

Prova questa:

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

La linea foreach viene semplicemente scorrendo un elenco di elementi chiamati "promemoria", non si tratta di nodi figlio.

Date un'occhiata a questo XPath tutorial per ulteriori informazioni:

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

+2

Era solo la prima risorsa da cui provenivo ed è sempre stata una fonte utile per me in passato, rispettata o meno. – 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

Se si desidera utilizzare LINQ con XML (Trovo il modo migliore) allora si dovrà utilizzare il System.Xml.Linq spazio dei nomi. Le classi in quello spazio dei nomi sono tutte con il prefisso X non Xml. La funzionalità in questo spazio dei nomi è più recente, migliore e molto più facile da manipolare con Linq.

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

Questo codice vi darà una variabile, alarm1 che è il ricordo che ha un nodo titolo di "Allarme 1".

Da questo punto non è chiaro per me esattamente ciò che si desidera modificare. Se si desidera solo cambiare il titolo, allora ...

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