如何使用.NET对XML文件进行排序?

时间:2009-04-04 04:53:15

标签: .net xml sorting

因此,您有一个第三方网络服务,它喜欢滥用XML并按顺序返回内容,使您的编程完全痛苦。例如......

<file>
  <node1>Foo</node1>
  <price>4.99</price>
  <node2>
    <key>XX999</key>
  </node2>
</file>

大约有一千个这些按价格排序。

如何按键值重新排序此XML文档?

我需要将结果作为已排序的XML文件。谢谢!

修改 .NET 2.0版(无LINQ)

4 个答案:

答案 0 :(得分:11)

以下是使用XSLT的方法:

假设您的数据采用此格式(file.xml):

<?xml version="1.0"?>
<listing>
<file>
  <node1>Foo</node1>
  <price>4.99</price>
  <node2>
    <key>XX999</key>
  </node2>
</file>
<file>
  <node1>Bar</node1>
  <price>5.67</price>
  <node2>
    <key>aa743</key>
  </node2>
</file>
<file>
  <node1>Was</node1>
  <price>5.67</price>
  <node2>
    <key>rr321</key>
  </node2>
</file>
</listing>

此转换(stylesheet.xsl):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="listing">
    <xsl:copy>
      <xsl:apply-templates select="file">
        <xsl:sort select="node2/key" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

与此.Net代码一起使用时(需要添加using System.Xml;):

XslCompiledTransform xslt= new XslCompiledTransform();
xslt.Load(@"c:\stylesheet.xsl");

xslt.Transform(@"C:\file.xml", @"c:\sorted.xml");

在sorted.xml中输出结果:

<?xml version="1.0" encoding="utf-8"?>
<listing>
  <file>
    <node1>Bar</node1>
    <price>5.67</price>
    <node2>
      <key>aa743</key>
    </node2>
  </file>
  <file>
    <node1>Was</node1>
    <price>5.67</price>
    <node2>
      <key>rr321</key>
    </node2>
  </file>
  <file>
    <node1>Foo</node1>
    <price>4.99</price>
    <node2>
      <key>XX999</key>
    </node2>
  </file>
</listing>

答案 1 :(得分:3)

应用Xml样式表将XML转换为适合您使用的XML格式。您可以在xsl转换期间按值轻松地对元素进行排序。

答案 2 :(得分:1)

当然,

XSLT规则,但我会使用LINQ To XML(即System.Xml.Linq命名空间中的内容)。具体来说,你需要做的是这样的事情:

newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever);

答案 3 :(得分:0)

Linq to XML会为你处理这个吗?