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

如何使用.NET对XML文件进行排序?,.net,xml,sorting,.net,Xml,Sorting,因此,您有一个第三方web服务,它喜欢滥用XML并按顺序返回内容,这使您的编程成为一件非常麻烦的事情。例如 <file> <node1>Foo</node1> <price>4.99</price> <node2> <key>XX999</key> </node2> </file> 福 4.99 XX999 按价格顺序排列的大约有一千种 如何按键值

因此,您有一个第三方web服务,它喜欢滥用XML并按顺序返回内容,这使您的编程成为一件非常麻烦的事情。例如

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

福
4.99
XX999
按价格顺序排列的大约有一千种

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

我需要的结果是一个排序的XML文件。谢谢

编辑:
.NET 2.0版(无LINQ)

以下是如何使用XSLT:

假设您的数据采用以下格式(file.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>

酒吧
5.67
aa743
是
5.67
rr321
福
4.99
XX999

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

Linq-to-XML会为您处理这个问题吗?

当然,XSLT规则,但我会使用Linq-to-XML(即
System.XML.Linq
命名空间中的内容)。具体来说,您需要做的是:

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

不,我需要在解析XML之前对其进行排序。我希望有一种方法可以在不将其强制转换到对象的情况下对其进行排序。“您是如何使用这些数据的?”这只是一个典型的HTTP请求,我需要解析一个巨大的字符串。XSLT?请给我举个例子或是别的什么-我真是一窍不通!好的,我正在阅读XSLT上的W3规范,但是select字符串是什么呢?非常好的答案!重新格式化样式表以增强可读性。您应该定义排序的含义。我看不出你发布的XML有什么问题。假设我有一千个这样的节点,按价格排序。我需要它们按键顺序排列。
XslCompiledTransform xslt= new XslCompiledTransform();
xslt.Load(@"c:\stylesheet.xsl");

xslt.Transform(@"C:\file.xml", @"c:\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>
newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever);