与XDocument的比较

3

我想比较XML文档。有些文档大小超过50k。我正在比较OuterXml。这种方法是否高效?是否有更高效的方法?

5个回答

8

仅仅比较XML的文本表示并不能产生有效的结果-看看这个例子:

<node x="1" y="2" />

并且

<node y="2" x="1" />

就 XML 处理而言,节点上属性的顺序无关紧要,因此它们在这方面是相同的,但当你比较文本时,你会标记它们有差异。

Microsoft 曾经在 GotDotNet 上拥有一个名为 XmlDiff 的工具,但我不确定它是否仍然可用......

更新
XmlDiff 似乎仍然可用 - 查看此 下载链接,以及 MSDN 上的 "在应用程序中使用 XML Diff 和 Patch 工具" 链接。

Marc


4

取决于您想进行什么样的比较。

例如,如果您只想比较两个文件中的内容并获得真/假状态,则建议为要比较的两个文件使用XmlReader,然后解析节点。一旦遇到差异,您就可以停止解析。

这与使用XML文档不同,在其中您必须将整个文档读入内存,获取字符串表示形式并比较字符串。(对于较小的文件大小无所谓)

两个XML文档可能在语义上是等效的,但结构可能不同。(在这种情况下,您的比较必须更加智能)。

如果您打算在比较失败/成功时修改源文档,则首选DOM方式(XmlDocument类及其API)。


我同意,这取决于逻辑等价性(两个XML文档中包含的字节数据是否相同)还是语义等价性(两个XML文档所表示的信息是否具有相同的含义)。例如,如果差异在于“不重要的空格”(例如元素缩进/格式化空格),那么您必须以不同的方式处理比较操作,而不仅仅是想知道每个属性、元素和节点的数据是否相同。 - Zach Burlingame

2

还有一个开源项目:http://diffxml.sourceforge.net/

我曾经使用过微软的XmlDiff和这个框架。我认为微软的XmlDiff具有更多的比较功能,所以现在我使用它。但是如果你想使用开源的话,DiffXml是一个不错的框架。


1
为了比较XML文件,我在使用MS XmlDiff时遇到了麻烦,因此我编写了一个更简单的比较方法。我编写了一个简单的应用程序,它会选择所有具有属性的元素,因为我需要比较的XML文件不会将值存储在元素节点本身中。在XPath中进行这种选择非常容易://[@]
我对两个文档都执行了此操作,从而得到了两个节点列表。然后,我通过递归地遍历其父节点并将属性值添加为条件来将这些节点更改为XPath字符串。因此,我最终得到了两个XPath字符串列表。
最后一步是遍历这些列表,检查另一个文档是否具有给定XPath的节点。如果没有,则表示缺少该节点,我就可以知道确切缺失的元素。这些缺失节点的列表被报告到文本文件中,因此我得到了有关两个文档之间差异的简单报告,忽略属性顺序、元素值和所有没有属性的元素。这正是我所需要的。

但是,如果您需要更复杂的XML比较,请阅读其他答案。 :-)

0

Project: Merge 是一个 Windows 应用程序,可以比较(和合并)XML 文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接