2009-06-26 45 views

回答

4

取决于你想要什么样的比较。例如,如果您的意图是比较两个文件中的内容并获得true/false状态,那么我会建议使用XmlReader作为要比较的两个文件中的每一个,然后解析这些节点。一旦遇到差异,您可以停止解析。

这是使用XML文档不同,你必须阅读整个文档到内存中,得到字符串表示和比较字符串。(对于更小的文件也没关系)

两个XML文档可以是语义上相同,但结构可能不同(在这种情况下,你的比较必须更聪明)。

如果您打算修改源文档,万一比较失败/成功,那么DOM方式是首选(XmlDocument类和它的API)。

+0

我同意,这取决于逻辑等价(同时包含在XML文档中的字节数据是相同的)或语义上等同是否(在两个XML文档表示的信息具有相同的含义)。例如,如果差异“无效空白”(例如元素缩进/格式化空白)很重要,则必须处理比较操作,而不是仅仅想知道每个属性,元素和节点数据是否相同等。 。 – 2009-06-26 06:11:18

8

只是比较你的XML不会产生有效结果的文字表述 - 检查了这一点:

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

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

是相同的,只要XML处理继续(对属性的顺序一个节点是无关紧要的),但是当你只比较文本时,你会将它标记为不同。

微软用来对一个GotDotNet上的工具XmlDiff,但我不知道这是仍然可用的地方.....

UPDATE
的xmldiff似乎仍然可用 - 看看这个download link ,以及MSDN上的这个“Using the XML Diff and Patch Tool in your application”链接。

马克

2

也有这个开源项目:http://diffxml.sourceforge.net/

我已经使用来自微软和这个框架两者的xmldiff。我认为MS XmlDiff有更多的比较功能,所以现在我使用它。但是如果你想开源,DiffXml是一个很好的框架。

1

为了比较XML文件,我遇到了MS XmlDiff的麻烦,所以我写了一个更简单的比较方法。我编写了一个简单的应用程序,它将选择所有具有属性的元素,因为我需要比较的XML文件不会将值存储在元素节点本身中。这个选择在XPath中是很容易的:// [@]
我为两个文档都做了这个,因此有两个节点列表。然后,我通过递归遍历其父节点并将这些可选值添加为条件,将这些节点更改为XPath字符串。因此,我结束了两个XPath字符串列表。
最后一步是查看这些列表,检查其他文档是否具有给定XPath的节点。如果没有,它就会丢失,我会知道丢失的确切元素。这个缺失节点列表被报告给一个文本文件,因此我有一个关于两个文档之间差异的简单报告,忽略了属性顺序,元素的值和没有属性的所有元素。这正是我需要的。

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

0

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