LINQ to XML:我如何只获得XElement的直接后代?

Rob*_*ers 17 .net xml vb.net linq-to-xml

Dim xml = <Root>
            <Parent id="1">
              <Child>Thomas</Child>
            </Parent>
            <Parent id="2">
              <Child>Tim</Child>
              <Child>Jamie</Child>
            </Parent>
          </Root>

Dim parents = xml.Elements
Run Code Online (Sandbox Code Playgroud)

在这种情况下,children包括所有Parent元素和所有Child元素.抓住直接后代的最佳方法是<Root>什么?

我应该编写一个LINQ查询来选择parent = <Root>?或者是否有一些我遗漏的内置方法可以为我解决这个问题?

编辑:XElement.Elements和之间有一些混淆XElement.Descendants.正如Ruben Bartelink所指出的那样,XElement.Elements我会给我一些正在寻找的东西.

Rub*_*ink 18

执行摘要 - 您想:

xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))
Run Code Online (Sandbox Code Playgroud)

第一个答案:

XElement.Descendants,还是一个技巧问题?:P 这里有一个使用Descendants的例子

修改回答,谢谢Tormod - 有些事情确实有问题!:

正如您所寻找的那样,元素可以提供直接的后代.后代给出了完整的等级[正如你所说的元素所做的那样].(我联系的例子清楚地说明了这一点.为混乱道歉!

所以,最后,你要找的是(这次在VB中):

Dim xml = <Root>
        <Parent id="1">
          <Child>Thomas</Child>
        </Parent>
        <Parent id="2">
          <Child>Tim</Child>
          <Child>Jamie</Child>
        </Parent>
      </Root>

REM All nodes two levels down in the hierarchy
Dim level2Nodes = xml.Elements.SelectMany(function(element) element.Elements)
level2Nodes.Dump

REM All Child nodes, no matter where they are:
Dim children = xml.Descendants("Child")
Run Code Online (Sandbox Code Playgroud)

由于REMs中涵盖的各种原因,每个元素都会产生3个```元素.

(在VB语句模式下将上面的内容直接粘贴到LINQPad中)

我现在看到什么可能让你感到困惑 - 当你使用Elements并在可视化器中查看它时,你仍然会看到孩子: -

Dim parents = xml.Elements
Run Code Online (Sandbox Code Playgroud)

如果您只想要实际名称,可以使用以下内容:

Dim parentNames = xml.Elements.Select(function(element) element.Name)
Run Code Online (Sandbox Code Playgroud)

请注意,在每种情况下,您都会得到两个结果.

如果你真的想剥离孩子,你想要:

Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))
Run Code Online (Sandbox Code Playgroud)

你可以扩展你的问题来展示你真正想要的东西吗?

  • Descendants()方法获取所有后代,而不仅仅是直接后代.在这种情况下,"root"的后代也将包括所有Child元素. (3认同)

JP *_*oto 17

XElement.Elements获取子元素的集合.例如 ...

var s = @"<root>
             <e1>
                 <e2>
                 </e2>
             </e1>
             <e1>
                 <e2>
                 </e2>
             </e1>
             <e1>
                 <e2>
                 </e2>
             </e1>
          </root>";

var doc = XElement.Load( new StringReader(s) );

Console.WriteLine( doc.Elements().Count() ); // 3
Console.WriteLine( doc.Descendants().Count()); //6
Run Code Online (Sandbox Code Playgroud)