我们将如何比较两个XML文档?
时间:2020-03-06 15:05:15 来源:igfitidea点击:
作为进行大量单元测试的基类的一部分,我正在编写一个辅助函数,该函数以递归方式比较一个XmlDocument对象的节点与C(.NET)中另一个对象的节点。对此的一些要求:
- 第一个文件是来源,例如我想要的XML文档是什么样子的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。因此,第二个是我要查找差异的那个,它不能包含第一个文档中没有的多余节点。
- 当发现太多显着差异时,必须抛出异常,并且应该由人类浏览一下说明很容易理解。
- 子元素的顺序很重要,属性可以是任何顺序。
- 有些属性是可忽略的。尤其是xsi:schemaLocation和xmlns:xsi,尽管我希望能够传递其中的一个。
- 名称空间的前缀必须在属性和元素中都匹配。
- 元素之间的空白无关紧要。
- 元素将具有子元素或者" InnerText",但不能同时具有两者。
当我凑在一起的东西时:有没有人写过这样的代码,可以在这里共享吗?
顺便说一句,我们将如何称呼第一文档和第二文档?我一直将它们称为"源"和"目标",但感觉不对,因为源是我想要目标的外观,否则会引发异常。
解决方案
Microsoft有一个可以使用的XML diff API
比较XML文档很复杂。 Google for xmldiff(甚至还有Microsoft解决方案)中的一些工具。我已经通过两种方法解决了这个问题。我使用XSLT对元素和属性进行排序(因为有时它们会以不同的顺序出现,并且我不在乎),并筛选出我不想比较的属性,然后都使用XML :: Diff或者XML :: SemanticDiff perl模块,或者将每个元素和属性都单独打印在每个文档上,并在结果上使用Unix命令行diff。
我正在使用ExamXML来比较XML文件。你可以尝试一下。
作者A7Soft还提供了用于比较XML文件的API
另一种方法是-
- 将两个文件的内容都放入两个不同的字符串中。
- 使用XSLT(将所有内容复制到两个新字符串)转换字符串。这将确保删除元素外部的所有空间。这将导致它产生两个新字符串。
- 现在,只需将两个字符串相互比较即可。
这不会为我们提供差异的确切位置,但是,如果我们只是想知道是否存在差异,那么无需任何第三方库就可以轻松实现。