在这里你去:
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