2009-04-04 9 views
4

Sie haben also einen Webservice eines Drittanbieters, der XML missbraucht und die Dinge in einer Reihenfolge zurücksendet, die Ihre Programmierung zu einem völligen Ärgernis macht. Zum Beispiel ...Wie sortiere ich eine XML-Datei mit .NET?

<file> 
    <node1>Foo</node1> 
    <price>4.99</price> 
    <node2> 
    <key>XX999</key> 
    </node2> 
</file> 

Es gibt etwa tausend von diesen in der Reihenfolge nach Preis sortiert.

Wie können Sie dieses XML-Dokument um den Schlüsselwert neu sortieren?

Ich brauche das Ergebnis, um eine sortierte XML-Datei zu sein. Vielen Dank!

EDIT: .NET Version 2.0 (kein LINQ)

+0

Sie sollten definieren, was Sie meinen, indem Sie sortieren. Ich sehe nichts falsches mit dem von Ihnen geposteten XML. –

+0

Angenommen, ich habe tausend dieser Knoten in der Reihenfolge nach Preis. Ich brauche sie sortiert nach Schlüssel. –

Antwort

11

Hier ist, wie es mit XSLT zu tun:

Ihre Daten unter der Annahme, nimmt diese 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> 

Diese Transformation (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> 

Wenn mit diesem .Net-Code verwendet (muß ein using System.Xml;):

XslCompiledTransform xslt= new XslCompiledTransform(); 
xslt.Load(@"c:\stylesheet.xsl"); 

xslt.Transform(@"C:\file.xml", @"c:\sorted.xml"); 

Ergebnisse in dieser Ausgabe in sorted.xml hinzuzufügen:

<?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> 
+0

Nein, ich muss dies vor dem Parsen der XML sortieren. Ich hätte lieber eine Möglichkeit, es zu sortieren, ohne es auf ein Objekt zu übertragen. –

+0

"Wie verbrauchen Sie diese Daten?" Es ist nichts anderes als eine klassische HTTP-Anfrage, und ich habe eine riesige Zeichenfolge, die geparst werden muss. –

+0

XSLT? Bitte hänge mich mit einem Beispiel oder etwas an - ich bin ahnungslos! –

3

einen XML-Stylesheet Nehmen, um XML-Quell in eine verwandeln XML-Format für Ihre Verwendung geeignet. Sie können Elemente während der xsl-Umwandlung einfach nach Werten sortieren.

0

Wird Linq to XML dies für Sie übernehmen?

1

XSLT-Regeln, natürlich, aber ich würde mit LINQ To XML gehen (d. H. Was ist in der System.Xml.Linq Namespace). Insbesondere müssen Sie Folgendes tun:

newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever);