2009-07-23 13 views
7

Qual è il modo migliore per aggiornare XElement (aggiornare il valore di itemNumber dell'elemento Pen) in questo XML?Come posso aggiornare un XElement specifico?

<?xml version="1.0" encoding="utf-8"?> 
<MyStore> 
    <Category> 
    <itemName>Pen</itemName> 
    <itemNumber>12</itemNumber> 
    </Category> 
    <Category> 
    <itemName>Paper</itemName> 
    <itemNumber>23</itemNumber> 
    </Category> 
</MyStore> 

risposta

11
XDocument doc; 
... 
XElement penItemValue = doc 
    .Elements("MyStore") 
    .Elements("Category") 
    .Elements("itemName") 
    .Single(itemName => itemName.Value == "Pen") 
    .Parent 
    .Element("itemValue"); 
penItemValue.Value = "123"; 
+0

Ho un problema con Elements and Element. Quando era Elements, mi dava un risultato nullo per l'xml sopra, ma ho seguito il tuo approccio e l'ho ottenuto. – paradisonoir

+0

Ottima risposta! Alcune cose che dovevo fare era fare riferimento a System.Linq e System.LinqExpressions nel mio progetto. Inoltre, l'equivalente VB.NET dell'istruzione .Single (xxx) è: .Single (Funzione (itemName) itemName.Value = "Pen") – robnick

1

Vorrei usare Xpath per trovare l'elemento che stavi cercando, quindi manipolarlo direttamente.

Per la qualcosa XPath come //Category[itemName='Pen']/itemNumber avrebbe trovato l'elemento for more on Xpath see

Il seguente (molto semplici) frammento opere per me in mono

using System.Xml; 

namespace test 
{ 

    class myclass 
    { 

    public static void Main(string[] argv) 
    { 
    XmlTextReader reader = new XmlTextReader(argv[0]); 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(reader); 
    reader.Close();   
    XmlNode myNode; 
    XmlElement root = doc.DocumentElement; 
    myNode = root.SelectSingleNode("//Category[itemName='Pen']/itemNumber"); 

    myNode.InnerText = "18"; 

    doc.Save(argv[1]); 
    } 
} 
} 
3

Si potrebbe trovare e aggiornarlo con LinqToXml:

XElement root = XElement.Load("myXml.xml"); 

var penCategory = from category in root.Descendants("Category") 
        where category.Element("itemName") != null 
        && category.Element("itemName").Value == "Pen" 
        select category; 

penCategory.Element("itemName").Value = updatedValue; 
+0

Perché usate 'Discendenti()' in modo aggressivo, dove 'Elements()' farebbe bene? –

+0

Habit più di ogni altra cosa. – womp

+0

thx, questo ha aiutato :) –

0

Utilizzando XPath (che sarà familiare alla maggior parte degli sviluppatori XML):

var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
    <MyStore> 
    <Category> 
     <itemName>Pen</itemName> 
     <itemNumber>12</itemNumber> 
    </Category> 
    <Category> 
     <itemName>Paper</itemName> 
     <itemNumber>23</itemNumber> 
    </Category> 
    </MyStore>"; 

    var doc = new XmlDocument(); 
    doc.LoadXml(xml); 
    var nav = doc.CreateNavigator(); 
    var iter = nav.Select("/MyStore/Category[itemName='Pen']/itemNumber"); 
    iter.MoveNext(); 
    iter.Current.SetValue("42"); 
+0

Ha chiesto specificamente di farlo per 'XElement'. –

Problemi correlati