Answers:
一种方法是首先将两个XML文件都转换为Canonical 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)
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
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)
警告--exc-c14n会 删除xml标头,而--c14n如果不存在,则会在xml标头前添加。
尝试使用@Jukka Matilainen的答案,但空格存在问题(其中一个文件是一个很大的单行)。使用--format
有助于跳过空格差异。
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
注意:使用vimdiff
命令来并排比较xml。
two.xml
是one.xml
由脚本生成的。因此,我只需要检查脚本添加/删除的内容。
--format
与结合获得最规范的版本--exc-c14n
。可能会是慢还是处理:(
--exc-c14n
选项指定属性的排序。在您的特定文件中,属性可能已经排序,但是一般建议是使用组合--format --exc-c14n
。
如果您还希望忽略子元素的顺序,我为此编写了一个简单的python工具xmldiffs
:
比较两个XML文件,忽略元素和属性的顺序。
用法:
xmldiffs [OPTION] FILE1 FILE2
任何其他选项都将传递给
diff
命令。
我的用于比较XML文件的Python脚本xdiff.py忽略了空格或属性顺序的差异(与元素顺序相反)。
为了比较两个文件1.xml
和2.xml
,您可以按如下运行脚本:
xdiff.py 1.xml 2.xml
在OP的示例中,它将不输出任何内容并返回退出状态0
(无结构或文本差异)。
在1.xml
和2.xml
结构上不同的情况下,它会模仿GNU diff的统一输出并返回退出状态1
。有多种选项可用于控制输出,例如-a
用于输出所有上下文,-n
不输出上下文以及-q
完全禁止输出(同时仍返回退出状态)。
我们的SD智能差异器根据结构而不是实际布局比较文档。
有一个XML智能差异器。对于XML,这意味着标签和内容的匹配顺序。应该注意的是,您指定的特定片段中的文本字符串是不同的。目前,它不了解标记属性的XML概念,该属性指示空白是否已规范化还是有效。
不确定在线工具的依赖性是否可以作为解决方案,但是,对于它的价值,我在此在线XML比较工具中获得了不错的成绩。它简单地工作。