2010-07-01 68 views
0

我有XML的這種層次幫助在.NET排序XML數據(與LINQ查詢也許?)

<Chapters> 
    <Chapter @num=""> 
    <Section @letter=""> 
    <Heading @num="" /> 
    </Section> 
    </Chapter> 
    </Chapters> 

我需要做一個排序,使所有章節都以升序排序,在每一節這一章測序升序排列,並在這部分中的每個標題排序...

執行以下操作得到正確排序的章節,但obivously子數據未排序:

Dim chapsorted = From c In root.Elements 
       Order By [email protected] Ascending 
       Select c 




從那裏,我迷路了。我嘗試這樣瘋狂的事情來獲得完整的結果我想,但沒有做我任何不太妙:要麼做我沒有什麼好

Dim chapsorted = From c In root.Elements 
      Order By [email protected] Ascending 
      Select (From sec In c.Elements Order By [email protected] Where sec.Parent Is c Select 
        (From hed In sec.Elements Order By [email protected] Where hed.Parent Is sec))) 

必須有一個簡單的方法來做到這一點.... :-)幫助將非常感激,我一直在旋轉我的車輪幾個小時。

回答

1

我認爲你的第一個查詢正處於正確的軌道上。通過複製名稱構造一個XElement出導致排序節點列表,並從原來的XElement屬性,然後窩那結構:

Dim chapsorted = New XElement(root.Name, _ 
    root.Attributes, _ 
    From c In root.Elements _ 
    Order By [email protected] Ascending _ 
    Select New XElement(c.Name, _ 
     c.Attributes, _ 
     From s In c.Elements _ 
     Order By [email protected] Ascending _ 
     Select New XElement(s.Name, _ 
      s.Attributes, _ 
      From h In s.Elements _ 
      Order By [email protected] Ascending _ 
      Select h))) 

如果你是通過在每個級別相同屬性的排序,你可以這樣做這樣的遞歸解決方案:

Private Function SortChildElements(ByVal element As XElement) As XElement 
    Return New XElement(_ 
     element.Name, _ 
     element.Attributes, _ 
     element.Nodes.Where(Function(node) Not TypeOf node Is XElement), _ 
     From child In element.Elements _ 
     Order By [email protected] Ascending _ 
     Select SortChildElements(child)) 
End Function 
+0

謝謝,謝謝!我明天會嘗試這個第一件事! – 2010-07-01 03:31:31