生成列表<;列表<;XElement>>;来自XML
本文关键字:gt lt 列表 XML 来自 XElement | 更新日期: 2023-09-27 18:22:12
我有一个XML,它被重新格式化为嵌套的HTML表头。我正致力于将XML文档的每一层放到它自己的列表中。例如:
<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>
在此示例中,"总计"、"日期"answers"唯一"列应位于第一个列表中。列"用户"answers"点击"应该在第二个列表中。"RC"answers"CB"列应在第三个列表中。这应该使用递归来实现,以使方法完全动态。非常感谢您的帮助。
开始:
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>
技巧来替换递归。