2010-07-01 1 views
0

У меня есть эта иерархия XMLПомощь сортировка данных XML в .NET (возможно с 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

СПАСИБО: Благодарю вас! Я попробую это первое завтра! –