Josh Stodola
Josh Stodola

Reputation: 82483

How to sort an XML file using .NET?

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

Answers (4)

Dmitri Nesteruk
Dmitri Nesteruk

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

Mitch Wheat
Mitch Wheat

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

Ian Suttle
Ian Suttle

Reputation: 3402

Will Linq to XML handle this for you?

Upvotes: 0

qux
qux

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

Related Questions