Linq to XML 选择具有特定属性的后代节点及其子孙节点

3
我发现了很多关于如何获取具有特定属性的后代的文章,但似乎找不到任何关于使用LINQ to XML选择具有不同属性的多个后代的内容。因此,从以下示例中,我需要选择所有Parent name = Ken AND Child name = Lorna的Grandchildren。可能需要最多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个回答

2
这里有多种选择,但我建议最简单的方法就是检查每个Grandchild:
var grandchildren = doc
    .Descendants("Grandchild")
    .Where(x => (string) x.Parent.Parent.Attribute("name") == "Ken" &&
                (string) x.Parent.Attribute("name") == "Lorna");

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接