Dot-Net

LINQ to XML:如何僅獲取 XElement 的直接後代?

  • August 4, 2009
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

在這種情況下,children包括所有父元素和所有子元素。僅獲取 的直系後代的最佳方法是<Root>什麼?

我應該編寫一個 LINQ 查詢來選擇 parent = 的元素<Root>嗎?或者是否有一些我缺少的內置方法可以為我得到這個?

編輯:XElement.Elements我在和之間有一些混淆XElement.Descendants。正如 Ruben Bartelink 指出的那樣,XElement.Elements它將給我正是我想要的。

執行摘要 - 你想要:

xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))

第一個答案:

XElement.Descendants,或者這是一個技巧問題?:P這裡有一個使用後代的例子

修改後的答案,謝謝 Tormod——感覺有些不對勁!:

Elements 提供直接後代,正如您正在尋找的那樣。後代給出了完整的層次結構[正如你所聲稱的元素所做的那樣]。(我連結到的例子清楚地說明了這一點。為混淆道歉!

所以,最後,你要找的是(這次是在 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")

由於 REM 中涵蓋的不同原因,每一個都會為您生成 3 個 ``` 元素。

( VB語句方式將上面直接粘貼到LINQPad中)

我現在看到了可能讓您感到困惑的地方 - 當您使用 Elements 並在視覺化器中查看它時,您仍然會看到孩子們:-

Dim parents = xml.Elements

如果您只想要實際名稱,則可以使用以下內容:

Dim parentNames = xml.Elements.Select(function(element) element.Name)

請注意,在每種情況下,您都會得到兩個結果。

如果你真的想去掉孩子,你想要:

Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))

您能否擴展您的問題以顯示您真正在尋找什麼?

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

引用自:https://stackoverflow.com/questions/1226899