我有一个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>
在此示例中,“Total”,“Date”和“Unique”列应位于第一个列表中。 “用户”和“点击”列应位于第二个列表中。并且,列“RC”和“CB”应该在第三个列表中。这应该使用递归来完成,使方法完全动态化。非常感谢任何帮助。
答案 0 :(得分:1)
你走了:
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
中可用,因此允许我们使用{{1用于替换递归的技巧。