生成列表<;列表<;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>>;来自XML

开始:

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>技巧来替换递归。