2012-02-02 79 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