2009-04-04 9 views
4

あなたはXMLを悪用し、プログラミングを首に完全に痛感させるような順序で返すようなサードパーティのWebサービスを持っています。たとえば、....NETを使用してXMLファイルをソートする方法は?

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

価格順に並べ替えられているものが約1000個あります。

このXMLドキュメントをキー値で再ソートするにはどうすればよいですか?

結果がソートされたXMLファイルである必要があります。ありがとう!

EDIT: .NETバージョン2.0(なしLINQ)

+0

並べ替えの意味を定義する必要があります。あなたが投稿したXMLに何も間違いはありません。 –

+0

私はこれらのノードが価格順に1000個あると仮定します。私はそれらをキー順にソートする必要があります。 –

答えて

11

ここではXSLTでそれを行う方法は次のとおりです。あなたのデータを想定し

は、このフォーム(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> 

この変換(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> 

この.NETコードで使用する場合(sorted.xmlに、この出力でusing System.Xml;):

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

xslt.Transform(@"C:\file.xml", @"c:\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> 
+0

いいえ、私は前にXMLを解析し、これをソートする必要があります。私はそれをオブジェクトにキャストせずにソートする方法がある方が好きです。 –

+0

「このデータをどのように消費していますか?」これは、古典的なHTTPリクエストが、何もない、と私は巨大な文字列を解析する必要があります。 –

+0

XSLT?私に例や何かをつけてください - 私は無知です! –

3

はにソースXMLに変換するためのXMLスタイルシートを適用あなたの使用に適したXML形式。 xsl変換中に要素を値で簡単にソートできます。

0

LinqがXMLを処理しますか?

1

XSLTルールは、もちろん、私はXMLにLINQと一緒に行きたい(すなわち、System.Xml.Linq名前空間に何がありますか)。具体的には、次のようなものが必要です。

newElement = new XElement(oldElement.Elements().OrderBy(x => x.Whatever); 
関連する問題