resource-list

XML parsing using LINQ in C #

In this XML file (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> 

using this code:

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

I have this OUTPUT:

 Vincent John Michael Frank 

The code works very well, but I need to get a value of 31 , which corresponds to the name = "age" field, where the name = "name" field is Vincent. How can I get this result?

+4
source share
1 answer

I recommend that you do the same as reading XML naturally.

In your code, try to find all fields with the name attribute set to "name" .

This process cannot be used to associate a name with age. It is natural to read XML and validate all resource elements. Then add to this element some of the information described in the field elements.

 // 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); 

Does he do what you want?

+6
source

All Articles