智能差异化方法 XML

Intelligent Way to Diff XML

我正在使用一个像平台一样运行的程序,它创建它使用的对象的实例,并将它们以 xml 格式存储在数据库中。该程序有一种方法可以将这些对象的 "dump" 创建到 xml 集合中。

我希望在我们的生产环境和开发环境之间进行转储差异,以便能够确定它们之间的任何增量。

由于转储取决于数据库中项目的顺序,因此普通差异没有意义。我需要的是一种在比较之前在两个转储中对 xml 元素进行排序的方法,以便差异更智能并更准确地反映增量。

例如:

文件 1:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
     <bar1>stuff1</bar1>
     <bar2>stuff2</bar2>
</foo>

文件 2:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
     <bar2>stuff2</bar2>
        <bar1>stuff1</bar1>
</foo>

我正在寻找一种方法,使上述文件的差异不会产生差异,因为唯一的差异是白色 space 和 foo.

元素的子顺序

关于如何使用大文件完成此操作有什么想法吗?

以下适用于小文件:

使用 http://prettydiff.com/ 我可以通过确保选择 "Sort markup pieces" 选项来完成此操作。之后我能够区分上面的内容并且它显示了匹配项。

我需要在本地执行类似这样的操作,该操作适用于大小相当大的文件。

考虑一下,我想如果有一种方法可以从命令行对 xml 文件进行排序,那么我可以对这些文件进行比较。

我对我的想法进行的后续谷歌引导我得出以下结论:https://superuser.com/questions/79920/how-can-i-diff-two-xml-files

在上面,关键是canonical xml sort。由于我使用的是 mac,上面给出了以下解决我的问题的方法,这对我有用:

$ xmllint --c14n File1.xml > 1.xml
$ xmllint --c14n File2.xml > 2.xml
$ diff 1.xml 2.xml

如果您使用的是 linux,或者正在使用诸如 cygwin installed/setup 和 windows 之类的软件,以上内容也适用于您。