запросить xmlnode используя linq - PullRequest
11 голосов
/ 23 февраля 2009

У меня есть следующий файл:

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

Я хочу узнать информацию, такую ​​как: Всего товаров в Дешево и Дорого, список всех категорий (например, Кулинария, Садоводство, Декорирование ...), список отсортированных категорий и выберите только продукт, который является «дорогостоящим»

Как я могу использовать LINQ. Я делал это до сих пор:

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

Ответы [ 2 ]

9 голосов
/ 23 февраля 2009

Ну, лично мне легче с 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"));
    }
9 голосов
/ 23 февраля 2009

Ваша структура 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...