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>
スヌーピーなどのおかげで彼らの助けになりました!
はどのようにして、現在、XMLデータを保存していますか?いくつかのコードを投稿してください。 – dtb
@dtb through XmlDocument.Save() –