因此,您有一个第三方网络服务,它喜欢滥用XML并按顺序返回内容,使您的编程完全痛苦。例如......
<file>
<node1>Foo</node1>
<price>4.99</price>
<node2>
<key>XX999</key>
</node2>
</file>
大约有一千个这些按价格排序。
如何按键值重新排序此XML文档?
我需要将结果作为已排序的XML文件。谢谢!
修改 .NET 2.0版(无LINQ)
答案 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会为你处理这个吗?