我从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() –