Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 帮助在.NET中对XML数据进行排序(可能使用LINQ查询?)_Wpf_Xml_Vb.net_Linq_Sorting - Fatal编程技术网

Wpf 帮助在.NET中对XML数据进行排序(可能使用LINQ查询?)

Wpf 帮助在.NET中对XML数据进行排序(可能使用LINQ查询?),wpf,xml,vb.net,linq,sorting,Wpf,Xml,Vb.net,Linq,Sorting,我有这种XML层次结构 <Chapters> <Chapter @num=""> <Section @letter=""> <Heading @num="" /> </Section> </Chapter> </Chapters> 从那里我迷路了。我尝试了这件疯狂的事情以获得我想要的全部结果,但这对我也没有任何好处: Dim chapsorted = From

我有这种XML层次结构

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



从那里我迷路了。我尝试了这件疯狂的事情以获得我想要的全部结果,但这对我也没有任何好处:

Dim chapsorted = From c In root.Elements
             Order By c.@num Ascending
             Select (From sec In c.Elements Order By sec.@letter Where sec.Parent Is c Select
                    (From hed In sec.Elements Order By hed.@num Where hed.Parent Is sec)))
那对我也没有好处


必须有一个简单的方法来做到这一点……:-)非常感谢您的帮助,我已经转了好几个小时了。

我认为您的第一个问题是正确的。通过从原始的
XElement
复制名称和属性,从已排序节点的结果列表中构建
XElement
,然后嵌套该结构:

Dim chapsorted = New XElement(root.Name, _
    root.Attributes, _
    From c In root.Elements _
    Order By c.@num Ascending _
    Select New XElement(c.Name, _
        c.Attributes, _
        From s In c.Elements _
        Order By s.@letter Ascending _
        Select New XElement(s.Name, _
            s.Attributes, _
            From h In s.Elements _
            Order By h.@num 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 child.@num Ascending _
        Select SortChildElements(child))
End Function
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 child.@num Ascending _
        Select SortChildElements(child))
End Function