构建列表<list <xelement>&gt;来自XML </list <xelement>

时间:2012-02-02 20:39:15

标签: c# xml recursion xelement

我有一个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”应该在第三个列表中。这应该使用递归来完成,使方法完全动态化。非常感谢任何帮助。

1 个答案:

答案 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用于替换递归的技巧。

相关问题