2011-06-24 47 views
2

我从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> 

感谢史努比和其他人的帮助!

+0

你是如何保存XML数据现在?发布一些代码。 – dtb

+0

@dtb通过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 = new SortedDictionary (); XmlNode节点; list.Add(“your_sort_key”,node); foreach(var list中的当前值) { //使用XML Writer } – NickD

0

如果使用文本差异工具进行比较,则需要修复缩进。但是,如果您使用XML比较工具进行比较,或者您编写了迭代节点并进行比较的工具,则缩进变得没有意义。

看看XML比较工具,比如一个来自Altova的位置:http://www.altova.com/downloadtrialdiffdog.html?gclid=CM-c8ayEzqkCFcNP4Qod4DTKMw

+0

对于比较XML,我对Beyond Compare 3 Pro(format:= XML Sorted and Tided)非常满意。它只是我想处理的排序和缩进的额外差异。 –

0

如果这是你想要什么差别,你对内容是自我唯一关心的,例如,检查是否标头是正确的设置,如果你缺少任何节点...

我强烈建议停止看到差异手动

我会创建一个简单的应用程序(窗口/网络),将读取这些2个文件夹和消费的每个文件名(让我们像它的名称相同),使每个节点和属性的图形表示,并且,Assert确保一切都在正确的位置。

在这个目录中很容易做到和you can programmatically check upon new files,并自动处理它们,例如生成输出到result目录,甚至数据库或电子邮件。

  • 打开文件(使用FileSystemWatcher避免做东西手动地)
  • 解析它们(解析它们成的自定义对象加载它们作为纯XMLNodeList
  • 比较他们(对于每个节点在原始(旧服务)文件中,新服务文件是否有这个?)
+0

我为什么要创建一个?我使用Beyond Compare,它对于这种目的非常有用。 –

0

我的建议将通过相同的Xslt(执行排序和缩进)来运行两个XmlDocuments。生成的XmlDocuments应该很容易与您选择的工具进行比较(手动)。