您的XML结构很不幸,因为它在层次结构的三个级别使用Product元素.你有其他类似于"家庭"的元素吗?
假设我们只想要家用产品,您可以使用:
计算每个便宜/昂贵的项目
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() });
列出所有类别
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();
要对此进行排序,请.OrderBy(x => x)
在最后使用.
选择"昂贵"的产品
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());
好吧,我个人觉得它更容易XmlDocument
:
XmlDocument root = new XmlDocument(); root.LoadXml(xml); // or .Load(path); var categories = root.SelectNodes( "/root/Product/Product/Product/@category") .Cast().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")); }