访问嵌套的子节点?

时间:2013-10-12 19:28:28

标签: c# xml linq linq-to-xml

使用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'元素不是文档的最终根源。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Linq查询一次性选择所有'c'元素:

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

现在从提取属性或选择任何子节点做任何你想做的事。

答案 1 :(得分:2)

使用linq; - )

您想要使用Descendants方法而不是Elements方法。像这样:

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