区分XML的智能方法

Jam*_*vec 5 xml diff

我正在使用一个类似于平台的程序,该程序创建它使用的对象的实例,并将它们以xml格式存储在数据库中。该程序可以将这些对象“转储”到xml集合中。

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

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

例如:

文件1:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
     <bar1>stuff1</bar1>
     <bar2>stuff2</bar2>
</foo>
Run Code Online (Sandbox Code Playgroud)

档案2:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
     <bar2>stuff2</bar2>
        <bar1>stuff1</bar1>
</foo>
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方式,上述文件的差异不会导致差异,因为唯一的差异是foo元素的空白和子顺序。

关于如何使用大文件完成此操作的任何想法?

以下适用于小文件:

通过使用http://prettydiff.com/,我可以通过确保选择“排序标记片段”选项来完成此操作。之后,我可以比较上面的内容,并显示出匹配项。

我需要在本地执行类似的操作,以适用于大小可能很大的文件。

Jam*_*vec 5

考虑一下,我想出是否有一种方法可以从命令行对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
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Linux,或者在Windows中使用了cygwin这样的安装/设置程序,那么上面的命令也应该对您有用。