Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;其中;使用LINQXML进行查询_C#_Xml_Linq - Fatal编程技术网

C# &引用;其中;使用LINQXML进行查询

C# &引用;其中;使用LINQXML进行查询,c#,xml,linq,C#,Xml,Linq,我一直在绞尽脑汁想如何执行LINQXML查询 我希望查询返回所有“产品”项的列表,其中category/name=“First category”在以下xml中 <catalog> <category> <name>First Category</name> <order>0</order> <product> <name>First Product</n

我一直在绞尽脑汁想如何执行LINQXML查询

我希望查询返回所有“产品”项的列表,其中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>

第一类
0
第一产品
0
3产品
2.
2产品
1.

您希望在此处使用
单一
扩展方法。请尝试以下操作:

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

请注意,这假设您只有一个名为“First category”的类别。如果你可能有更多,我建议使用马克的解决方案;否则,这应该是更合适/有效的解决方案。此外,如果任何
类别
节点没有
名称
子节点,这将引发异常。否则,它应该完全满足您的需要。

您希望在此处使用
单一扩展方法。请尝试以下操作:

var category = doc.RootNode.Elements("category").Single(
    c => c.Attribute("name").Value == "First Category");
var products = category.Elements("product");
请注意,这假设您只有一个名为“First category”的类别。如果你可能有更多,我建议使用马克的解决方案;否则,这应该是更合适/有效的解决方案。此外,如果任何
类别
节点没有
名称
子节点,这将引发异常。否则,它应该完全满足您的要求。

就像这样:

    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);
    }
像这样:

    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);
    }
下面是一个例子:

        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);
        }
下面是一个例子:

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

似乎只有一个
category
具有名称优先的类别,因此
Single
在这里可能更合适。我认为可以安全地假设这是一个较大xml块的片段,否则过滤本身是多余的。在这种情况下,您无法说出有多少具有给定名称的类别……在各种UI框架中,名称意味着唯一性。我可能会想到其他几个例子。我认为争论什么是相当主观的问题没有多大意义。我同意,这主要是猜测。OP无论如何都有两种解决方案,因此他们可以选择其中一种:如果
元素
返回空值,那么显式转换到
字符串
不会有任何问题?似乎只有一个
类别
是名称优先的类别,因此
单个
在这里可能更合适。我认为可以安全地假设这是一个较大xml块的片段,否则,过滤本身是多余的。在这种情况下,您无法说出有多少具有给定名称的类别……在各种UI框架中,名称意味着唯一性。我可能会想到其他几个例子。我认为争论什么是相当主观的问题没有多大意义。我同意,这主要是猜测。OP无论如何都有两种解决方案,因此他们可以选择其中一种:我认为如果
元素
返回null,那么显式转换到
字符串
不会有任何问题?现在这让我感到困惑。这个答案是完全正确的,因为(IMO fair)假设OP只寻找一个称为“第一类”的类别……我同意它应该有效(虽然属性内容可能更简单,如果缺少任何元素/属性,您可能会抛出异常)+1这里。。。我不知道为什么,但这个问题的所有原始答案都得到了反对票。@Marc:干杯。是的,我可能应该为空属性对象添加警告,但是如果
Name
保证存在。。。我现在只是否决了乌龟先生的答案。(我重新正确阅读了问题和你的答案后,我将你的改为向上投票!)现在这让我感到困惑。这个答案是完全正确的,因为(IMO fair)假设OP只寻找一个称为“第一类”的类别……我同意它应该有效(虽然属性内容可能更简单,如果缺少任何元素/属性,您可能会抛出异常)+1这里。。。我不知道为什么,但这个问题的所有原始答案都得到了反对票。@Marc:干杯。是的,我可能应该为空属性对象添加警告,但是如果
Name
保证存在。。。我现在只是否决了乌龟先生的答案。(我重新正确阅读了问题和你的答案后,我将你的改为向上投票!)