在這裏你去:
XElement root = XElement.Parse(@"
<doc>
<column1>
<column2 />
</column1>
<column3 />
<column4>
<column5>
<column6 />
<column7 />
</column5>
</column4>
</doc>");
List<List<XElement>> outerList = new List<List<XElement>>();
List<XElement> innerList = root.Elements().ToList();
while (innerList.Any())
{
outerList.Add(innerList);
innerList = innerList.SelectMany(element => element.Elements()).ToList();
}
編輯:如果你想你的列表中剝奪他們的後代的祖先XElement
情況下,那麼你可以使用下列內容:
XElement root = XElement.Parse(@"
<table>
<column name=""Total"" size=""0"">
<column name=""Users"" size=""0"" />
</column>
<column name=""Date"" size=""0"" />
<column name=""Unique"" size=""0"">
<column name=""Clicks"" size=""0"">
<column name=""RC"" size=""0"" />
<column name=""CB"" size=""0"" />
</column>
</column>
</table>");
List<List<XElement>> outerList = new List<List<XElement>>();
IEnumerable<XElement> innerList = root.Elements();
while (innerList.Any())
{
outerList.Add(innerList.Select(e => new XElement(e.Name, e.Attributes())).ToList());
innerList = innerList.SelectMany(element => element.Elements());
}
注:爲了記錄,你應該使用遞歸的直覺是正確的。但是,衆所周知,任何遞歸函數都可以轉換爲迭代,通常通過模擬堆棧。有時候,這會導致代碼臃腫;然而,其他時候,轉換自然會有所幫助。在你的情況下,如果你想遞歸,你的遞歸參數應該是當前正在考慮的元素集中的直接子元素 - 這已經發生在innerList
中,因此允許我們使用innerList = innerList.<SequenceOperation>
技巧來替代遞歸。
' '無效的XML。請先清除。 –
2012-02-02 20:43:47
@HenkHolterman - 他們都不是*無效的XML嗎? – 2012-02-02 20:45:04
是的。他們是。這只是示例數據。我會用更接近我正在使用的東西進行更新。 – Joe 2012-02-02 20:45:42