如何比较XML文件

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

我有两个XML文件(XSD),它们是由某个工具生成的。
该工具不保留元素的顺序,因此尽管内容相同,但将其作为文本进行比较会导致文件不同。
是否有某种工具可以在比较之前对元素进行排序,并启用文档的文本比较? 当然,排序需要递归完成

数据示例:
文件A:

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

文件B:

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


XML示例有根本的不同。即使内容和层次结构可能相同,对等点之间的关系也不同。当XML被解析时,它被解析成一个称为DOM的结构,其中单元之间的关系非常重要。如果您想忽略对等实体之间关系的性质,那么您可能需要定制软件。我建议找到一些简单的开源XML感知差异工具,并添加您需要的额外需求。我在上写了一篇,但我建议你在做决定之前先看看有什么可用的,因为编辑其他人的算法可能需要一些繁重的工作。

看一看描述使用xslt的解决方案的文章。

你可以在php中使用perl模块DifferenceMarkup或xmldiff-pecl.php.net/xmldiff扩展。两者都将生成一个人类可读的XML差异文档。

我遇到了一个类似的问题,我最终发现:

这篇文章建议先进行规范的XML排序,然后再进行差异排序。如果您使用的是Linux、Mac,或者安装了类似Cygwin的Windows,那么以下内容应该适用:

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

为了实现它的价值,我创建了一个java工具(实际上是kotlin),用于高效且可配置的xml文件规范化

它将始终:

  • 按名称对节点和属性进行排序
  • 删除名称空间(是的,假设这可能是个问题)
  • 预先打印结果
此外,您可以告诉它:

  • 删除给定的节点名称列表-可能您不想知道一段元数据的值-例如
    已更改
  • 在父级上下文中对给定的集合列表进行排序-也许您不关心
    项的顺序是否已更改
它使用XSLT,并使用链接有效地完成上述所有工作

局限性 它确实支持对嵌套列表进行排序—在外部列表之前对最内部的列表进行排序。但它不能可靠地对任意级别的递归嵌套列表进行排序

如果您有这样的需求,您可以在使用此工具后比较结果的排序字节数组。如果只剩下列表排序问题,它们将是相等的

去哪里买
你可以在这里找到它:

这并不能回答问题。规范化不会对元素进行排序(因为两个元素顺序不同的XML文件通常在语义上是不同的)。提供的命令在提供的示例上不起作用。