запрос "where" с использованием linq xml - PullRequest
1 голос
/ 14 июля 2009

напрягает мой мозг, пытаясь понять, как выполнить запрос linq xml.

Я бы хотел, чтобы запрос возвратил список всех элементов "product", где category / name = "First Category" в следующем xml

<catalog>
  <category>
    <name>First Category</name>
    <order>0</order>
    <product>
      <name>First Product</name>
      <order>0</order>
    </product>
    <product>
      <name>3 Product</name>
      <order>2</order>
    </product>
    <product>
      <name>2 Product</name>
      <order>1</order>
    </product>
  </category>
</catalog>

Ответы [ 3 ]

6 голосов
/ 14 июля 2009

Вроде так:

    XDocument doc = XDocument.Parse(xml);
    var qry = from cat in doc.Root.Elements("category")
              where (string)cat.Element("name") == "First Category"
              from prod in cat.Elements("product")
              select prod;

или, возможно, с анонимным типом:

    XDocument doc = XDocument.Parse(xml);
    var qry = from cat in doc.Root.Elements("category")
              where (string)cat.Element("name") == "First Category"
              from prod in cat.Elements("product")
              select new
              {
                  Name = (string)prod.Element("name"),
                  Order = (int)prod.Element("order")
              };
    foreach (var prod in qry)
    {
        Console.WriteLine("{0}: {1}", prod.Order, prod.Name);
    }
1 голос
/ 14 июля 2009

Вот пример:

        string xml = @"your XML";

        XDocument doc = XDocument.Parse(xml);

        var products = from category in doc.Element("catalog").Elements("category")
                       where category.Element("name").Value == "First Category"
                       from product in category.Elements("product")
                       select new
                       {
                           Name = product.Element("name").Value,
                           Order = product.Element("order").Value
                       };
        foreach (var item in products)
        {
            Console.WriteLine("Name: {0} Order: {1}", item.Name, item.Order);
        }
0 голосов
/ 14 июля 2009

Вы хотите использовать здесь метод расширения Single. Попробуйте следующее:

var category = doc.RootNode.Elements("category").Single(
    c => c.Attribute("name").Value == "First Category");
var products = category.Elements("product");

Обратите внимание, что это предполагает, что у вас есть только одна категория с именем "Первая категория". Если у вас есть больше, я рекомендую использовать решение Марка; в противном случае это должно быть более подходящим / эффективным решением. Кроме того, это вызовет исключение, если какой-либо узел category не имеет дочернего узла name. В противном случае он должен делать именно то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...