我從XML格式的兩種不同的Web服務獲得響應。兩種Web服務都具有相同的邏輯,但是採用不同的技術開發。我們正在將我們的網絡服務轉移到微軟技術。 Web服務引擎是連接到許多其他應用程序並向它們提供不同服務的核心。C#:如何在保存前對XML進行排序和縮進?
每當有生產Web服務調用時,我們都會將相似的調用傳遞給在Microsoft Technologies上開發的Web服務,並將兩個響應保存在單獨的文件夾中。
現在,我們必須比較兩個響應(XML)。有很多排序和意向問題。我想避免所有排序和縮進問題,以便我可以得到正確的比較報告。
有沒有辦法可以排序和縮進 XML在保存之前(XMLDocument.Save)呢?
謝謝。
解決方案:
我已經發現了一些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通過XmlDocument.Save() –