xdocument from c# linq linq-to-xml

from - xelement c#



consulta xmlnode usando linq (2)

Tengo el siguiente archivo:

<root> <Product desc="Household"> <Product1 desc="Cheap"> <Producta desc="Cheap Item 1" category="Cooking" /> <Productb desc="Cheap Item 2" category="Gardening" /> </Product1> <Product2 desc="Costly"> <Producta desc="Costly Item 1" category="Decoration"/> <Productb desc="Costly Item 2" category="Furnishing" /> <Productc desc="Costly Item 3" category="Pool" /> </Product2> </Product> </root>

Deseo encontrar información como: Total de artículos en Cheap and Costly, lista de todas las categorías (como Cooking, Gardening, DEcoration ...), lista de categorías clasificadas y seleccionar solo el Producto que es ''Costly''

¿Cómo puedo usar LINQ? Hice esto hasta ahora

XElement xe = XElement.Load(Server.MapPath("~/product.xml")); ????


Bueno, personalmente me resulta más fácil con XmlDocument :

XmlDocument root = new XmlDocument(); root.LoadXml(xml); // or .Load(path); var categories = root.SelectNodes( "/root/Product/Product/Product/@category") .Cast<XmlNode>().Select(cat => cat.InnerText).Distinct(); var sortedCategories = categories.OrderBy(cat => cat); foreach (var category in sortedCategories) { Console.WriteLine(category); } var totalItems = root.SelectNodes( "/root/Products/Product/Product").Count; Console.WriteLine(totalItems); foreach (XmlElement prod in root.SelectNodes( "/root/Product/Product[@desc=''Costly'']/Product")) { Console.WriteLine(prod.GetAttribute("desc")); }


Su estructura XML es desafortunada ya que utiliza un elemento Product para tres niveles de la jerarquía. ¿Tiene otros elementos similares al "hogar"?

Suponiendo que solo queremos los familiares, puede usar:

Cuente los artículos en cada uno de los baratos / costosos

xe.Element("Product") // Select the Product desc="household" element .Elements() // Select the elements below it .Select(element => new { Name=(string) element.Attribute("desc"), Count=element.Elements().Count() });

Listar todas las categorías

xe.Descendants() // Select all descendant elements .Attributes() // All attributes from all elements // Limit it to "category" elements .Where(attr => attr.Name == "category") // Select the value .Select(attr => attr.Value) // Remove duplicates .Distinct();

Para ordenar esto, simplemente use .OrderBy(x => x) al final.

Seleccione productos ''costosos''

xe.Descendants() // Select all elements // Only consider those with a "Costly" description .Where(element => (string) element.Attribute("desc") == "Costly") // Select the subelements of that element, and flatten the result .SelectMany(element => element.Elements());