【问题标题】:C# ASP.NET Sort XML Nodes by custom attributeC# ASP.NET 按自定义属性对 XML 节点进行排序
【发布时间】:2017-09-13 11:55:41
【问题描述】:

有没有一种方法可以根据属性值对 xmlnodes 进行排序?关键是每个子节点都有不同的名称,尽管如此,我还是想按属性对它们进行排序。
例如

<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 回答不能解决我的问题,因为我无法定义节点“项目”,因为我的每个节点的名称都不同。

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

【问题讨论】:

标签: c# asp.net xml linq sorting


【解决方案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;
        });

根据您的示例,其中 data 和 Doc 是父元素是您的属性。 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;
         });

【讨论】:

  • 那两个“元素”呢?它们不应该是节点名称吗?
【解决方案2】:

排序

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");

【讨论】:

  • OP 有 一个 文件,其中的节点应该被排序。
  • 我们不应该定义属性“data”在doc子节点中吗?
  • 我编辑了答案,但您应该定义属性data 来对属性data 内的值确定的元素进行排序
猜你喜欢
  • 2013-08-30
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2023-01-11
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多