我有两个由某些工具生成的 XML 文件 (XSD)。
该工具不保留元素的顺序,因此尽管内容相同,但比较它,因为文件不同会导致文本。
是否有一些工具可以在比较之前对元素进行排序并启用文档的文本比较?当然,排序需要递归完成。
数据示例:
文件 A:
<xml>
<A/>
<B/>
</xml>
文件 B:
<xml>
<B/>
<A/>
</xml>
我有一个类似的问题,我最终发现:http ://superuser.com/questions/79920/how-can-i-diff-two-xml-files
那篇文章建议先做一个规范的 XML 排序,然后再做一个 diff。如果您使用的是 Linux、Mac,或者您的 Windows 安装了 Cygwin 之类的东西,则以下内容应该对您有用:
$ xmllint --c14n FileA.xml > 1.xml
$ xmllint --c14n FileB.xml > 2.xml
$ diff 1.xml 2.xml
查看Using XSLT to Assist Regression Testing描述了使用 xslt 的解决方案
对于它的价值,我创建了一个 java 工具(实际上是 kotlin),用于对 xml 文件进行有效且可配置的规范化。
它将永远:
此外,您可以告诉它:
<RequestReceivedTimestamp>
已经改变了。<Contact>
条目的顺序<ListOfFavourites>
已更改。它使用 XSLT 并使用链接有效地完成上述所有工作。
它确实支持排序嵌套列表 - 在外部列表之前排序最里面的列表。但它不能可靠地对任意级别的递归嵌套列表进行排序。
如果您有这样的需求,您可以 - 在使用此工具后 - 比较结果的排序字节数组。如果仅存在列表排序问题,它们将是相等的。
你可以在这里得到它:XMLNormalize
XML 样本根本不同。即使内容和层次结构可能相同,对等点之间的关系也不同。当 XML 被解析时,它被解析成一个称为 DOM 的结构,其中单元之间的关系非常重要。如果您想忽略对等实体之间关系的性质,那么您可能需要定制软件。我建议找到一些简单的开源 XML 感知差异工具并添加您需要的其他要求。我在http://prettydiff.com/上写了一篇文章,但我建议您在做出决定之前四处看看有什么可用的,因为编辑别人的算法可能需要一些繁重的工作。
您可以使用 perl 模块 DifferenceMarkup http://metacpan.org/pod/XML::DifferenceMarkup或 PHP 中的 xmldiff pecl.php.net/xmldiff 扩展。两者都将生成人类可读的 XML 差异文档。