2012-02-02 78 views
1

我有一个XML,它的布局是要重新格式化为嵌套的HTML表格标题。我正在努力将XML文档的每一层都放到它自己的列表中。例如:从XML构建列表<列表<XElement>>

<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

''无效的XML。请先清除。 – 2012-02-02 20:43:47

+0

@HenkHolterman - 他们都不是*无效的XML吗? – 2012-02-02 20:45:04

+0

是的。他们是。这只是示例数据。我会用更接近我正在使用的东西进行更新。 – Joe 2012-02-02 20:45:42

回答

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中,因此允许我们使用innerList = innerList.<SequenceOperation>技巧来替代递归。

+0

这是完美的。谢谢。 – Joe 2012-02-02 21:01:46

+0

这很有道理。再次,我非常感谢你的帮助。 – Joe 2012-02-02 21:22:48

+0

不客气:-) – Douglas 2012-02-02 21:27:35