如何比较XML文件
我有两个XML文件(XSD),它们是由某个工具生成的。如何比较XML文件,xml,diff,Xml,Diff,我有两个XML文件(XSD),它们是由某个工具生成的。 该工具不保留元素的顺序,因此尽管内容相同,但将其作为文本进行比较会导致文件不同。 是否有某种工具可以在比较之前对元素进行排序,并启用文档的文本比较? 当然,排序需要递归完成 数据示例: 文件A: <xml> <A/> <B/> </xml> 文件B: <xml> <B/> <A/> </xml> XML示例有根本的不同。
该工具不保留元素的顺序,因此尽管内容相同,但将其作为文本进行比较会导致文件不同。
是否有某种工具可以在比较之前对元素进行排序,并启用文档的文本比较? 当然,排序需要递归完成 数据示例:
文件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文件规范化 它将始终:
- 按名称对节点和属性进行排序
- 删除名称空间(是的,假设这可能是个问题)
- 预先打印结果
- 删除给定的节点名称列表-可能您不想知道一段元数据的值-例如
已更改 - 在父级上下文中对给定的集合列表进行排序-也许您不关心
中
项的顺序是否已更改
你可以在这里找到它:这并不能回答问题。规范化不会对元素进行排序(因为两个元素顺序不同的XML文件通常在语义上是不同的)。提供的命令在提供的示例上不起作用。