Linq to XML选择具有特定属性的后代的后代

时间:2015-06-17 20:06:38

标签: c# xml linq

我发现了许多关于获取具有特定属性的后代的文章,但我似乎无法通过LINQ to XML选择具有不同属性的多个后代。因此,从以下示例中,我需要选择Parent name = Ken AND Child name = Lorna所有的孙子。潜在地,我需要最多4个AND子句,因为我的真实XML比下面的示例更深。

我可以编码选择Ken的所有孩子,但找不到比这更深的例子。

非常感谢任何帮助

<?xml version="1.0" encoding="UTF-8"?>
<FamilyTree>
  <Parent name="Ken">
    <Child name="Lorna">
      <Grandchild name="Andrew"/>
      <Grandchild name="Brian"/>
    </Child>
    <Child name="Mike">
      <Grandchild name="Ann"/>
      <Grandchild name="Beth"/>
    </Child>
  </Parent>
  <Parent name="Norma">
    <Child name="Owen">
      <Grandchild name="Charles"/>
    </Child>
    <Child name="Peter">
      <Grandchild name="Charlotte"/>
    </Child>
  </Parent>
  <Parent name="Quinn">
    <Child name="Robert">
      <Grandchild name="Debbie"/>
      <Grandchild name="Eric"/>
    </Child>
    <Child name="Susan">
      <Grandchild name="Frank"/>
    </Child>
  </Parent>
</FamilyTree>

1 个答案:

答案 0 :(得分:2)

这里有多种选择,但我建议最简单的方法就是检查每个孙子:

var grandchildren = doc
    .Descendants("Grandchild")
    .Where(x => (string) x.Parent.Parent.Attribute("name") == "Ken" &&
                (string) x.Parent.Attribute("name") == "Lorna");

或者您可以找到所有相关的Child元素,然后检索他们的孩子:

var grandchildren = doc
    .Descendants("Child")
    .Where(x => (string) x.Parent.Attribute("name") == "Ken" &&
                (string) x.Attribute("name") == "Lorna")
    .Elements("Grandchild");