访问嵌套的子节点

本文关键字:子节点 嵌套 访问 | 更新日期: 2023-09-27 18:35:10

在使用xmltextreader一段时间后,发现"使用linq"几乎是这里每个.NET xml相关问题的答案,我决定试一试,到目前为止它真的很好,但是我正在使用的文档有点奇怪,所以现在我遇到了一点问题。

我正在使用的内容的简化版本;

<a>
  <b name="..." id=".">
    <c id="..." type="...">
        <value_I_want>.....</value_I_want>
    </c>
    <c id="..." type="...">
        <value_I_want>.....</value_I_want>
    </c>

我需要查询"a"来获取"c"的每个实例的属性和元素 - 我无法查询"b",因为它不是唯一的,并且会返回一堆不相关的东西。

我可能应该提到,"a"元素不是文档的最终根源。

有什么想法吗?

访问嵌套的子节点

您可以使用

Linq 查询一次选择所有'c'元素:

XDocument doc = XDocument.Load("<yourxml/>"); 
var c_elements = doc.Descendants("a")
                    .Descendants("b")
                    .Descendants("c);

现在,通过提取属性或选择任何子节点来执行任何操作。

使用 linq ;-)

您希望使用"后代"方法,而不是"元素"方法。 像这样:

        var xdoc = XDocument.Load("<yourxml/>"); 
        var celes = xdoc.Descendants("a").Descendants("c"); 

这将首先找到所有元素"a",然后在该集合中查找所有元素"c"。 这可能是您想要的,也可能不是您想要的。 为了确保您有正确的父母身份,您可以这样做:

        var xdoc = XDocument.Load("<yourxml/>");
        var celes = xdoc.Descendants("c")
                        .Where(x => (x.Parent != null) && (x.Parent.Name == "b"))
                        .Where(x => (x.Parent.Parent != null) && (x.Parent.Parent.Name == "a"));