whats news new microsoft features docs compute c# xml-parsing linq-to-xml

news - new features c#



AnĂ¡lisis XML utilizando LINQ en c# (1)

En este archivo xml (http://www.studiovincent.net/list.xml):

<list version="1.0"> <meta> <type>resource-list</type> </meta> <resources start="0" count="4"> <resource classname="Quote"> <field name="name">Vincent</field> <field name="username">Hill</field> <field name="age">31</field> <field name="hair">black</field> </resource> <resource classname="Quote"> <field name="name">John</field> <field name="username">Tedelon</field> <field name="age">27</field> <field name="hair">brown</field> </resource> <resource classname="Quote"> <field name="name">Michael</field> <field name="username">Lopez</field> <field name="age">20</field> <field name="hair">red</field> </resource> <resource classname="Quote"> <field name="name">Frank</field> <field name="username">Lopez</field> <field name="age">25</field> <field name="hair">black</field> </resource> </resources> </list>

usando este código:

using System.Xml; using.System.Xml.Linq; XmlReader reader = XmlReader.Create("http://www.studiovincent.net/list.xml"); XElement el = XElement.Load(reader); reader.Close(); var items = el.Elements("resources").Elements("resource").Descendants().DescendantNodes(); var items = from item in el.Elements("resources").Elements("resource").Descendants() where item.Attribute("name").Value == "name" select item.FirstNode; foreach (XNode node in items) { Console.WriteLine(node.ToString()); }

Tengo esta SALIDA:

Vincent John Michael Frank

El código funciona muy bien, pero necesito obtener el valor 31 que corresponde al nombre del campo = "edad", donde el nombre del campo = "nombre" es Vicente. ¿Cómo puedo obtener este resultado?


Te recomiendo que hagas lo que harías cuando leas XML de forma natural.

En su código, intente encontrar todos los campos con el atributo de name establecido en "name" .

Este proceso no puede usarse para asociar un nombre con una edad. Es más natural leer el XML y verificar todos resource elementos del resource . A continuación, agregue a este elemento alguna información descrita en los elementos del field .

// Using LINQ to SQL XDocument document = XDocument.Load("http://www.studiovincent.net/list.xml"); // Loads the XML document. XElement resourcesElement = document.Root.Element("resources"); // Gets the "resources" element that is in the root "list" of the document. XElement resourceElementVincent = (from resourceElement in resourcesElement.Elements("resource")// Gets all the "resource" elements in the "resources" element let fieldNameElement = resourceElement.Elements("field").Single(fieldElement => fieldElement.Attribute("name").Value == "name") // Gets the field that contains the name (there one and only one "name" field in the "resource" element -> use of Single()) where fieldNameElement.Value == "Vincent" // To get only resources called "Vincent" select resourceElement).Single(); // We suppose there is one and only 1 resource called "Vincent" -> Use of Single() XElement fieldAgeElement = resourceElementVincent.Elements("field").Single(fieldElement => fieldElement.Attribute("name").Value == "age"); // Gets the corresponding "age" field int age = int.Parse(fieldAgeElement.Value, CultureInfo.InvariantCulture); // Gets the age by Parse it as an integer Console.WriteLine(age);

¿Hace lo que quieres?