在 Linux 上,如何在两个 XML 文件之间生成差异?
理想情况下,我希望能够将其配置为严格的某些内容,或放松某些内容,例如空格或属性顺序。
我经常会关心这些文件在功能上是否相同,但 diff 本身使用起来会很烦人,尤其是在 XML 文件没有很多换行符的情况下。
例如,以下对我来说应该没问题:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
Run Code Online (Sandbox Code Playgroud)
小智 105
一种方法是首先将两个 XML 文件转换为规范 XML,然后使用diff
. 例如,xmllint可用于规范化 XML。
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
Run Code Online (Sandbox Code Playgroud)
或者作为单线。
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Run Code Online (Sandbox Code Playgroud)
rjt*_*rjt 28
Jukka 的回答对我不起作用,但它确实指向了 Canonical XML。--c14n和--c14n11都没有对属性进行排序,但我确实发现--exc-c14n开关确实对属性进行了排序。 --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)
Run Code Online (Sandbox Code Playgroud)
警告--exc-c14n 会 删除 xml 标头,而 --c14n 会在 xml 标头前面加上(如果不存在)。
Gur*_*ruM 22
试图使用@Jukka Matilainen 的答案,但在空格方面存在问题(其中一个文件是一个巨大的单行)。使用--format
有助于跳过空白差异。
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
Run Code Online (Sandbox Code Playgroud)
注意:使用vimdiff
命令并排比较 xml。
如果您还想忽略子元素的顺序,我为此编写了一个简单的 Python 工具,名为xmldiffs
:
比较两个 XML 文件,忽略元素和属性顺序。
用法:
xmldiffs [OPTION] FILE1 FILE2
任何额外的选项都会传递给
diff
命令。
在https://github.com/joh/xmldiffs获取它
归档时间: |
|
查看次数: |
87329 次 |
最近记录: |