Here's how to do it with XSLT:
Assuming your data takes this form (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>
This is the conversion (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>
When used with this .NET code (you must add using System.Xml;):
XslCompiledTransform xslt= new XslCompiledTransform(); xslt.Load(@"c:\stylesheet.xsl"); xslt.Transform(@"C:\file.xml", @"c:\sorted.xml");
The results of this output in the sorted.xml file:
<?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>
source share