【发布时间】:2012-08-16 19:45:26
【问题描述】:
是否有开源命令行工具(适用于 Linux)来区分忽略元素顺序的 XML 文件?
示例输入文件a.xml:
<tag name="AAA">
<attr name="b" value="1"/>
<attr name="c" value="2"/>
<attr name="a" value="3"/>
</tag>
<tag name="BBB">
<attr name="x" value="111"/>
<attr name="z" value="222"/>
</tag>
<tag name="BBB">
<attr name="x" value="333"/>
<attr name="z" value="444"/>
</tag>
b.xml:
<tag name="AAA">
<attr name="a" value="3"/>
<attr name="b" value="1"/>
<attr name="c" value="2"/>
</tag>
<tag name="BBB">
<attr name="z" value="444"/>
<attr name="x" value="333"/>
</tag>
<tag name="BBB">
<attr name="x" value="111"/>
<attr name="z" value="222"/>
</tag>
所以比较这两个文件不应该输出任何差异。 我尝试先使用 XSLT 对文件进行排序:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="WINDOWS-1252" omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="@*" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但问题是元素<tag name="BBB"> 没有排序。它们只是按照输入的顺序输出。
我已经看过diffXml、xDiff、XMLUnit、xmlstarlet,但这些都不能解决问题;差异输出应该是人类可读的,例如就像使用diff时一样。
关于如何解决排序或忽略元素顺序差异的任何提示?谢谢!
【问题讨论】:
-
我知道它不是命令行工具,但如果你可以使用 X ;然后Meld 把手指放在鼻子里了 :) 否则 diff 也能发挥作用,不是吗?我不会复制 diff 的输出,但看起来还可以。
-
xmllint 可以规范化您的 xml,然后您可以使用普通 diff。
-
嗯。在寻找 xmllint 的确切参数时,Google 向我发送了这个重复的问题:superuser.com/questions/79920/how-can-i-diff-two-xml-files
-
感谢您的建议,我也已经看到并尝试了 xmllint,但对于我的示例,它似乎不起作用。规范化我的两个输入,输出结果和输入一样。
标签: xml sorting command-line open-source diff