2009-07-23 25 views
7

¿Cuál es la mejor manera de actualizar un elemento XElement (al actualizar el valor del elemento Número de elemento Pen) en este XML?¿Cómo puedo actualizar un XElement específico?

<?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> 

Respuesta

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

Tengo un problema con Elementos y Elemento. Cuando era Elements, me dio un resultado nulo para el xml anterior, pero he seguido su enfoque y lo obtuve. – paradisonoir

+0

¡Excelente respuesta! Algunas cosas que tenía que hacer era hacer referencia a System.Linq y System.LinqExpressions en mi proyecto. Además, el equivalente de VB.NET de la declaración .Single (xxx) es: .Single (Function (itemName) itemName.Value = "Pen") – robnick

1

Utilizaría Xpath para encontrar el elemento que estaba buscando, luego lo manipularé directamente.

Para el algo XPath como //Category[itemName='Pen']/itemNumber encontraría el elemento for more on Xpath see

La siguiente (muy básico) fragmento de código funciona para mí en 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

Se podía encontrarlo y actualizarlo usando 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

¿Por qué usar 'Descendientes()' de manera tan agresiva, donde 'Elementos()' habría ningún problema? –

+0

Hábito más que nada. – womp

+0

thx, esto ayudó :) –

0

Usando XPath (que será familiar a la mayoría de los desarrolladores 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

Preguntó específicamente acerca de hacer esto para 'XElement'. –

Cuestiones relacionadas