2017-09-13 30 views
0

有没有一种方法可以基于属性值对xmlnodes进行排序?关键是每个子节点都有不同的名称,尽管如此,我想按属性对它们进行排序。
例如C#ASP.NET按自定义属性排序XML节点

<Doc> 
<mar_03 data="03"> 
    <Mattina_Turno_1 /> 
</mar_03> 
<dom_01 data="01"> 
    <Mattina_Turno_1 /> 
</dom_01> 
<mer_04 data="04"> 
    <Mattina_Turno_1 /> 
    <Mattina_Turno_2 /> 
</mer_04> 
</Doc> 

应该成为

<Doc> 
<dom_01 data="01"> 
    <Mattina_Turno_1 /> 
</dom_01> 
<mar_03 data="03"> 
    <Mattina_Turno_1 /> 
</mar_03> 
<mer_04 data="04"> 
    <Mattina_Turno_1 /> 
    <Mattina_Turno_2 /> 
</mer_04> </Doc> 

我该怎么办呢?明显排序后,我想覆盖文件。

This答案不能解决我的问题,因为我无法定义节点“item”,因为每个节点的名称都不相同。

谢谢,请不要将它标为重复,因为它不是!

+0

[如何通过C#中的节点属性对XML文件进行排序](https://stackoverflow.co m/questions/34539948/how-to-sort-xml-files-by-a-node-attribute-in-c-sharp) –

+0

以下解决方案无法在此处应用。 @FerasAlSous –

回答

0

排序

XDocument xDoc = XDocument.Load("FileName.xml"); 

    var res = xDoc.Element("Doc") 
        .Elements() 
        .OrderByDescending(c => (int) c.Attribute("data")); 

然后将其保存:

XDocument doc = new XDocument(new XElement("Doc", res)); 
doc.Save("FileName.xml"); 
+0

OP有* 1 *文件,其中应对节点进行排序。 –

+0

我们不应该定义属性“data”在doc子节点中吗? –

+0

我编辑答案,但你应该定义属性'data'来对属性'data'中的值确定的元素进行排序 –

1

请尝试,

XDocument xdoc = XDocument.Load("File.xml"); 

     var result = xdoc.Element("Doc") 
     .Elements() 
     .OrderBy(s => (int)s.Attribute("data")); 

     string xmlOutPut = string.Empty; 

     result.ToList().ForEach(a => 
     { 
      xmlOutPut += a; 
     }); 

如果数据和文件是父元素是根据你的榜样你的属性。 File.xml是你的xml文件名。您将得到有序输出 'xmlOutPut'

或单一的LINQ查询一切,

XDocument xdoc = XDocument.Load("XMLFile2.xml"); 
     string xmlOutPut = string.Empty; 

     xdoc.Element("Doc") 
      .Elements() 
      .OrderBy(s => (int)s.Attribute("data")) 
     .ToList().ForEach(a => 
     { 
      xmlOutPut += a; 
     }); 
+0

这两个“元素”呢?他们不应该成为节点的名字吗? –

+0

试试我编辑过的解决方案 –