Reputation: 82483
So you have a third-party web service that likes to abuse XML and return things in an order that makes your programming a complete pain in the neck. For example...
<file>
<node1>Foo</node1>
<price>4.99</price>
<node2>
<key>XX999</key>
</node2>
</file>
There are about a thousand of these sorted in order by price.
How can you re-sort this XML document by the key value?
I need the result to be a sorted XML file. Thanks!
EDIT: .NET version 2.0 (no LINQ)
Upvotes: 4
Views: 5023
Reputation: 23789
XSLT rules, of course, but I'd go with LINQ To XML (i.e., what's in the System.Xml.Linq
namespace). Specifically, what you need to do is something like this:
newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever);
Upvotes: 1
Reputation: 300489
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 transform (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 (need to add a using System.Xml;):
XslCompiledTransform xslt= new XslCompiledTransform();
xslt.Load(@"c:\stylesheet.xsl");
xslt.Transform(@"C:\file.xml", @"c:\sorted.xml");
Results in this output in 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>
Upvotes: 11
Reputation: 1165
Apply an Xml Style Sheet to transform to source XML into an XML format suitable for your use. You can easily sort elements by values during the xsl transformation.
Upvotes: 3