如何区分两个 XML 文件?

如何区分两个 XML 文件?

在 Linux 上,如何生成两个 XML 文件之间的差异?

理想情况下,我希望能够将其配置为一些严格的事物,或者放松一些东西,例如空格或属性顺序。

我经常会关心文件在功能上是否相同,但 diff 本身使用起来会很烦人,特别是当 XML 文件没有很多换行符时。

例如,以下内容对我来说确实应该没问题:

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>

答案1

一种方法是先将两个 XML 文件转换为规范 XML,并使用 比较结果diff。例如,xmllint可用于规范化 XML。

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

或者作为一行。

$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)

答案2

Jukka 的答案对我来说不起作用,但它确实指向了 Canonical XML。--c14n也不--c14n11对属性进行了排序,但我确实找到了--exc-c14nswitch 确实对属性进行了排序。 --exc-c14n在手册页中没有列出,但在命令行上描述为“W3C 独家规范格式”。

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

$ xmllint | grep c14
    --c14n : save in W3C canonical format v1.0 (with comments)
    --c14n11 : save in W3C canonical format v1.1 (with comments)
    --exc-c14n : save in W3C exclusive canonical format (with comments)

$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686

$ cat /etc/system-release
CentOS release 6.5 (Final)

警告--exc-c14n 删除 xml 标头,而如果没有,--c14n 会在 xml 标头前面添加该标头。

答案3

尝试使用@Jukka Matilainen 的答案,但遇到了空格问题(其中一个文件是一行很长的代码)。使用--format有助于跳过空格差异。

xmllint --format one.xml > 1.xml  
xmllint --format two.xml > 2.xml  
diff 1.xml 2.xml  

注意:使用vimdiff命令对 xml 进行并排比较。

答案4

差异xml尽管它似乎没有提供很多配置选项,但基本功能正确。

编辑:项目差异xml自 2013 年起已迁移至 GitHub。

相关内容