用于逻辑比较两个 xml 文件的实用程序?

用于逻辑比较两个 xml 文件的实用程序?

目前,我们正在尝试为我们的环境构建黄金配置。我们使用的一款软件依赖大型XML文件来包含其大部分配置。我们希望将我们的实验室环境归类为“黄金配置”,然后能够在将来针对该配置进行审核。

由于 diff 是按字节比较而不是逻辑比较,因此在这种情况下我们不能使用它来比较文件(XML无序,因此不起作用)。我正在寻找可以解析两个XML文件并逐个元素进行比较的东西。到目前为止,我们还没有找到可以做到这一点的实用程序。操作系统无关紧要,我可以在任何可以运行它的地方做到这一点。首选项是现成的。

有任何想法吗?

编辑:我们遇到的一个问题是,一个供应商的配置文件偶尔会多次提及同一元素,每次都有不同的属性。无论我们使用哪种 diff 实用程序,都需要能够识别属性集或将它们全部识别为一个元素的一部分。任务艰巨 :)

答案1

我使用的两种方法是 (a) 将两个 XML 文件规范化,然后比较它们的序列化,以及 (b) 使用 XPath 2.0 deep-equal() 函数。这两种方法都可以告诉您文件是否相同,但不能很好地告诉您它们的区别所在。

专门解决此问题的商业工具是 DeltaXML。

如果您认为某些内容是等价的,但在 XML 级别上却并不等价(例如,元素的顺序不同),那么您可能必须准备在比较之前进行转换以规范化文档。

答案2

这里有一个好的答案:

问题:如何区分两个 XML 文件?| 超级用户

答案:如何区分两个 XML 文件?| 超级用户

$ xmllint --format --exc-c14n one.xml > 1.xml
$ xmllint --format --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml

对于未能遵守 serverfault 惯例,我深表歉意...我相信有人会让我知道,并且我会做出适当的修改。

答案3

基于 Pythonxmldiff看起来是一个非常有吸引力的解决方案;它声称“提取两个 xml 文件之间的差异并返回一组原语以应用于源树以获取目标树”。

例子:

a1.xml

<root>
</root>

a2.xml

<root attr="test1">
</root>

xmldiff a1.xml a2.xml

[append-first, /,
<root attr="test1"/>
]
[remove, /root[2]]

答案4

商业的自由的具有“XML 感知”功能的工具,可以毫不费力地完成您的需要。显然还有一个eclipse 插件这将比较 XML。

或者,您可以通过以下方式完成对字段的排序xsl:排序或者通过在 XSD 中指定序列顺序(这将使任何现有文档在定义上无效。)然后在与非 xml 感知 diff 工具进行比较之前“规范化”两个文档。首先进行规范化会删除任何不影响 XML 实际内容的格式差异。(将其视为应用 XML 代码样式过滤器。)

相关内容