如何比较XML文件

17
我有两个由某些工具生成的XML文件(XSD)。该工具未保留元素的顺序,因此尽管内容相等,将其作为文本进行比较将导致文件不同。是否有一些工具可以在比较之前对元素进行排序,并启用文档的文本比较?当然,需要递归地进行排序。
数据示例: 文件A:
<xml>
  <A/>
  <B/>
</xml>

文件B:

<xml>
  <B/>
  <A/>
</xml>

我发现了一个网站,可以比较XML和JSON。https://www.jsoftwarelabs.com/jslutils/xml-comparison 我不确定它是否适用于如此大的文件,但您可以随时通过info@jsoftwarelabs.com与他们联系。 我已经尝试使用它来比较大型XML,最大可达100MB,但绝对不是GB级别。我认为这值得一试。您可以将XML文件分成块,然后迭代地进行比较。另一个优点是它有一个标志,可以忽略节点或元素的顺序。 - DJDeveloper
5个回答

19

我曾经遇到过类似的问题,最终找到了解决方法:http://superuser.com/questions/79920/how-can-i-diff-two-xml-files

那篇文章建议先对XML文件进行规范排序,再进行比较。如果你正在使用Linux、Mac或者已经安装了类似Cygwin的Windows系统,下面的方法应该适用:

$ xmllint --c14n FileA.xml > 1.xml
$ xmllint --c14n FileB.xml > 2.xml
$ diff 1.xml 2.xml

2
这并没有回答问题。规范化不会对元素进行排序(因为两个具有不同元素顺序的XML文件通常是语义上不同的)。提供的命令在提供的示例上无法正常工作。 - Pik'

1

1
据我所知,我创建了一个Java工具(实际上是Kotlin),用于高效和可配置的XML文件规范化。
它将始终:
- 按名称对节点和属性进行排序。 - 删除命名空间(是的 - 这可能会是一个问题)。 - 美化输出结果。
此外,您还可以告诉它:
- 删除给定节点名称列表 - 也许您不想知道元数据的值是否已更改。 - 在父级上下文中对给定集合列表进行排序 - 也许您不关心在中条目的顺序是否已更改。
它使用XSLT并使用链接高效地执行所有操作。
限制:
- 它支持排序嵌套列表 - 先按内部最深层的列表排序,再按外部列表排序。但是,它无法可靠地对任意级别的递归嵌套列表进行排序。 - 如果您有这样的需求,则可以在使用此工具后比较结果的排序字节数组。如果仅存在列表排序问题,则它们将相等。

获取方式

您可以在此处获取:XMLNormalize


0

0

XML样本基本上是不同的。即使内容和层次结构可能相同,但对等方之间的关系是不同的。当解析XML时,它被解析为一种称为DOM的结构,其中单位之间的关系非常重要。如果您想忽略对等实体之间的关系性质,则可能需要自定义软件。我建议找到一些简单的开源XML感知差异工具,并添加您需要的其他要求。我在http://prettydiff.com/编写了一个,但在做出决定之前建议您四处寻找可用的工具,因为编辑别人的算法可能需要一些艰苦的努力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接