我想比较xml文档。有些是50k +。我正在比较OuterXml。这有效吗?是否有更有效的方法?
答案 0 :(得分:8)
只是比较XML的文本表示不会产生有效结果 - 请查看:
<node x="1" y="2" />
和
<node y="2" x="1" />
与XML处理相同(节点上的属性顺序无关紧要),但是当你只比较文本时,你会将它标记为差异。
微软以前在GotDotNet上有一个XmlDiff工具,但我不确定它是否仍然可以在某处......
<强>更新强>
XmlDiff似乎仍然可用 - 请查看此download link以及MSDN上的此“Using the XML Diff and Patch Tool in your application”链接。
马克
答案 1 :(得分:4)
取决于您想要的比较类型。
例如,如果您打算只比较两个文件中的内容并获得true / false状态,那么我建议您为要比较的两个文件中的每一个使用XmlReader,然后解析节点。遇到差异的那一刻,你可以停止解析。
这与使用XML文档的不同之处在于,您需要将整个文档读入内存,获取字符串表示并比较字符串。(对于较小的文件大小,无关紧要)
两个xml文档在语义上是等价的,但结构可能不同。(在这种情况下,你的比较必须更聪明)。
如果您打算修改源文档,如果比较失败/成功,则首选DOM方式(XmlDocument类及其API)。
答案 2 :(得分:2)
还有这个开源项目:http://diffxml.sourceforge.net/
我使用了MicroSoft的XmlDiff和这个框架。我认为MS XmlDiff有更多的比较功能,所以现在我用它。但是如果你想要开源,DiffXml就是一个很好的框架。
答案 3 :(得分:1)
为了比较XML文件,我遇到了MS XmlDiff的麻烦,所以我写了一个更简单的比较方法。我写了一个简单的应用程序,它将选择所有具有属性的元素,因为我需要比较的XML文件不会在元素节点本身中存储值。这个选择在XPath中很容易:// [@ ]
我为这两个文档做了这个,因此有两个节点列表。然后我通过递归遍历它的父节点并将attruibute值添加为条件,将这些节点更改为XPath字符串。因此,我最终得到了两个XPath字符串列表
最后一步是通过这些列表,检查另一个文档是否有一个给定XPath的节点。如果没有,它就会丢失,我会知道缺少的确切元素。这个丢失节点列表被报告给一个文本文件,因此我有一个关于两个文档之间差异的简单报告,忽略了属性顺序,元素的值和没有属性的所有元素。这正是我所需要的。
但是,如果您需要更复杂的XML比较,请阅读其他答案。 : - )
答案 4 :(得分:0)
Project: Merge是一个可以比较(和合并)XML文件的Windows应用程序。