Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort an XML file using .NET?

Tags:

.net

sorting

xml

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)

like image 924
Josh Stodola Avatar asked Dec 08 '22 07:12

Josh Stodola


2 Answers

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>
like image 158
Mitch Wheat Avatar answered Dec 20 '22 20:12

Mitch Wheat


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.

like image 39
qux Avatar answered Dec 20 '22 20:12

qux