2011-06-24 3 views
2

2つの異なるWebサービスからの応答がXML形式で取得されています。どちらのWebサービスも同じロジックを持ちますが、異なるテクノロジで開発されています。私たちはWebサービスをMicrosoft Technologyに移行しています。 Webサービスエンジンは、他の多くのアプリケーションに接続され、さまざまなサービスを提供するコアです。C#:保存する前にXMLを並べ替えてインデントする方法は?

本物のWebサービスへの呼び出しがあるたびに、Microsoft Technologiesで開発されたWebサービスに同様の呼び出しを行い、両方の応答を別々のフォルダに保存します。

ここで、両方の応答(XML)を比較する必要があります。並べ替えと問題を扱うことがたくさんあります。並べ替えとインデントの問題をすべて回避したいので、正しい比較レポートを得ることができます。

XML(XMLDocument.Save)を保存する前に、 XMLを並べ替えてインデントする方法はありますか?

ありがとうございます。


ソリューション:

私はネット上でそれを行う、いくつかのXSLTを見つけましたが、要素が属性を持っているとき 問題があるように思われています。

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-template select="@* | node()"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-template> 
    </xsl:copy> 
</xsl:template> 

実際、属性ノードは別のタイプのノードの前に結果ツリーにコピーする必要があります。ソートのために、ノード集合は文書の順序を失い、したがって、属性が要素およびテキストノードより早く処理されることをもはや保証することができない。

一つの解決策はこれです:

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
     <xsl:apply-templates select="node()"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

しかし、結果ツリーの直列化後の属性の相対的な出力順序は、プロセッサに依存するため、あなたにも、ソート属性を省略する場合があります

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="node()"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

スヌーピーなどのおかげで彼らの助けになりました!

+0

はどのようにして、現在、XMLデータを保存していますか?いくつかのコードを投稿してください。 – dtb

+0

@dtb through XmlDocument.Save() –

答えて

3

ファイルを比較するためにxmlunitをお勧めします。このnunit拡張子はc#で書かれています。 http://xmlunit.sourceforge.net/

または手動を好む場合は、このようにそれを行うには、比較しています

 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml("bla"); 
XmlTextWriter writer = new XmlTextWriter("data.xml",null); 
writer.Formatting = Formatting.Indented; 
doc.Save(writer); 
+0

@Snoppyありがとうございます。これはクエリの半分をカバーします。どのようにXMLを知らなくてもノードをソートする方法はありますか? –

+0

System.Collections.Generic.SortedDictionary list = 新しいSortedDictionary <文字列、XmlNode>(); XmlNodeノード。 list.Add( "your_sort_key"、node); foreach(リスト内の現在の変数) { // XMLライターを使用して書き込み } – NickD

0

テキスト差分ツールを使用して比較する場合、インデントを修正する必要があります。しかし、XML比較ツールを使用して比較した場合や、ノード全体を反復処理して比較するツールを作成した場合、インデントが問題になります。こうしたここのAltovaから1としてXML差分ツールで

ルック:それはあなたが望むものの違いだとあなたはコンテンツも自己についての唯一の懸念されている場合は、ヘッダーが正しくされている場合http://www.altova.com/downloadtrialdiffdog.html?gclid=CM-c8ayEzqkCFcNP4Qod4DTKMw

+0

XMLを比較するためのBeyond Compare 3 Pro(形式:= XML Sorted and Tided)に非常に満足しています。並べ替えとインデントのちょっとした違いです。 –

0

、例えば、チェックノードが見つからない場合は、設定してください。

私は強くお勧めします違いを見る停止MANUALLY

私はシンプルなアプリケーション(窓が/ウェブ)、これらの2つのフォルダを読み込み、各ファイル名を消費(みましょう画像それは同じ名前だ)と、各ノードおよびプロパティのグラフィカルな表現になるだろう、と、Assertを作成しますすべてが正しい場所にあるということです。

you can programmatically check upon new filesはそのディレクトリに作成して自動的に処理し、resultディレクトリやデータベースや電子メールなどの出力を生成します。

  • オープン(手動のものを行うことを避けるためにFileSystemWatcherを使用して)ファイル
  • は、それぞれの(それらを比較(プレーンXMLNodeListとしてそれらをロードするカスタムオブジェクトにそれらを解析する)彼らにを解析します新しいサービスファイルにはそれがありますか?)
+0

なぜ私は1つを作成しますか?私はBeyond Compareを使用しており、そのような目的には非常に便利です。 –

0

私の提案両方のXmlDocumentsを同じXslt(並べ替えとインデントを実行)で実行することになります。結果として得られるXmlDocumentsは、あなたが選んだツールと(手動で)比較するのが簡単でなければなりません。

関連する問題