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

本文关键字:后代 属性 XML to 选择 Linq | 更新日期: 2023-09-27 17:56:44

我找到了很多关于获取具有特定属性的后代的文章,但我似乎找不到任何关于使用 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>

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

这里有多个选项,但我建议最简单的事情就是检查每个孙子:

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