如何区分两个 XML 文件?

qed*_*edi 94 linux xml diff

在 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)

  • 你也可以在一行中完成`vimdiff &lt;(xmllint --c14n one.xml) &lt;(xmllint --c14n two.xml)` (19认同)
  • 如果不明显,c14n 是 _canonicalization_ 的缩写。 (13认同)
  • 最好在 diff 之前执行一个额外的步骤 - 格式化两个 XML (xmllint --format)。因为我注意到如果没有这一步,差异会显示出不必要的差异。 (5认同)
  • 从来不知道 xmllint 中的 --c14n 开关。这很方便。 (2认同)
  • 再次运行“xmllint --format”可能会有所帮助(请参阅其他答案) (2认同)

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。

  • `--exc-c14n` 选项指定属性的排序。在您的特定文件中,属性可能已经排序,但一般建议是使用组合`--format --exc-c14n`。 (6认同)
  • 这是我需要的选项。据说最规范的版本可以通过结合 `--format` 和 `--exc-c14n` 来获得;处理起来可能会更慢:( (2认同)

dso*_*ano 7

Diffxml获得了正确的基本功能,尽管它似乎没有提供很多配置选项。

编辑:自 2013 年以来,项目Diffxml已迁移到 GitHub。


joh*_*joh 6

如果您还想忽略子元素的顺序,我为此编写了一个简单的 Python 工具,名为xmldiffs

比较两个 XML 文件,忽略元素和属性顺序。

用法: xmldiffs [OPTION] FILE1 FILE2

任何额外的选项都会传递给diff命令。

https://github.com/joh/xmldiffs获取它