在 Linux 上,如何生成两个 XML 文件之间的差异?
理想情况下,我希望能够将其配置为一些严格的事物,或者放松一些东西,例如空格或属性顺序。
我经常会关心文件在功能上是否相同,但 diff 本身使用起来会很烦人,特别是当 XML 文件没有很多换行符时。
例如,以下内容对我来说确实应该没问题:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
答案1
答案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 进行并排比较。