Dot-Net
LINQ to XML:如何僅獲取 XElement 的直接後代?
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