2016-08-16 20 views
1

我想根据内部属性“Top”的值以升序对XML元素进行排序。如何使用子节点排序XML元素?

<?xml version="1.0" encoding="utf-8"?> 
    <Root> 
     <Designer> 
     <Sequence> 
      <Left>603.875</Left> 
      <Top>312.665</Top> 
      <total>NaN</total> 
      <Width>58.5</Width> 
      <Height>45.5</Height> 
      <ID>635b1aed-6ee3-4cf5-9324-b0246f3a0c1d</ID> 
      <zIndex>0</zIndex> 
      <IsGroup>false</IsGroup> 
      <ParentID>00000000-0000-0000-0000-000000000000</ParentID>  
      <ItemLabel>123</ItemLabel> 
     </Sequence> 
     <Sequence> 
      <Left>568.875</Left> 
      <Top>29.664999999999992</Top> 
      <total>NaN</total> 
      <Width>58.5</Width> 
      <Height>45.5</Height> 
      <ID>9dd9a96d-4356-49c6-85a3-6b898983e688</ID> 
      <zIndex>1</zIndex> 
      <IsGroup>false</IsGroup> 
      <ParentID>00000000-0000-0000-0000-000000000000</ParentID> 
      <ItemLabel>321</ItemLabel> 
     </Sequence> 
     </Designer> 
<Parameters> 
<Value> 
<Name> Label 1 </Name> 
<ID> 1 </ID> 
</Value> 
<Value> 
<Name> Label 2 </Name> 
<ID> 2 </ID> 
</Value> 
</Parameters> 

</Root> 

这是我试过的代码。

try 
    { 
     XElement root = XElement.Load(MainWindow.Container.globalfilename +".xml"); 
     var orderedtabs = root.Elements("Designer").Elements("Sequence") 
             .OrderBy(xtab => (float)xtab.Element("Top")) 
             .ToArray(); 

     foreach (XElement tab in orderedtabs) 
     { 
        root.Add(tab); 
     } 
     root.Save("xmlfile" + ".xml"); 
     MessageBox.Show("Sorted"); 
    } 

当我尝试创建一个新的XML文件时,标记被删除。但我可以按顺序写入。 但是,它的元素被删除。

请在我出错的地方提供答案或更正。

预先感谢您。

+0

我会做'的GroupBy(X => x.Element(“顶部”)值).OrderBy()' ... –

+0

你的代码有什么问题?当你运行它会发生什么? – theFunkyEngineer

+0

@theFunkyEngineer编写时,标签被删除,其他标签如被删除。 –

回答

1

您的Root,Designer和Parameters标签会被删除,因为您只选择了序列标签,然后将其添加到您的根目录顶部。我建议删除下面设计师的所有序列标签,再重新插入下设计的有序序列:

 XElement root = XElement.Load("input.xml"); 
     // Extract Sequences ordered by 'Top' 
     var orderedtabs = root.Elements("Designer").Elements("Sequence") 
           .OrderBy(xtab => (float)xtab.Element("Top")) 
           .ToArray(); 
     // Remove Sequences from xml 
     root.Descendants("Designer").Elements("Sequence").Remove(); 
     // Reinsert Sequences in new order under the Designer element 
     XElement designer = root.Descendants("Designer").FirstOrDefault(); 
     foreach (XElement tab in orderedtabs) 
     { 
      designer.Add(tab); 
     } 
     root.Save("xmlfile" + ".xml"); 
+0

谢谢Ton Plooij。有用。 –