如何区分2个xml文件并将补丁应用到第三个xml文件?

时间:2018-06-22 22:36:03

标签: xml xmldiff

让我们假设有一个默认的version 1 XML文件:

<!--
  Specification for a shirt
-->
<shirt color="red" size="L">
  <buttons count=20/>
  <pocket position="left">
    <!-- this might be removed later on -->
  </pocket>
</shirt>

在生产环境中部署时,此更改(出于某种原因,我们并不关心)如下(我们将其称为1A):

<!-- Specification for a shirt -->
<shirt size="M" color="blue">
  <buttons count=16/>
  <pocket position="left">
    <!-- this might be removed later on -->
  </pocket>
</shirt>

现在,发布了XML version 2的新版本作为新的默认值:

<!--
  Specification for a shirt
-->
<shirt color="red" size="L" vendor="xyz">
  <buttons count=16/>
  <cloth type="silk"/>
</shirt>

现在,生产中的所有1A文件都需要更改。

问题是我们如何找到前两个XML文件之间的差异并将其修补到第三个XML文件中?并不是说生产中的文件可能会更改XML属性的顺序,这不会算作语义更改,在计算差异时应将其忽略。同样,应忽略两个属性之间的换行符。 示例:

<shirt color="red" size="L">

应被视为等同于:

<shirt size="L"
    color="red">

我知道我们可以编写一个Java程序来做到这一点,但是如果有一个xmldiff这样的实用工具,那将是非常棒的,因为实际的XML文件大了数千行,并且有数百个这样的文件并在生产中运行许多变体。

第二,如果在进行差异/补丁时保留version 2中的注释,那就太好了

1 个答案:

答案 0 :(得分:0)

首先,就设计而言,我宁愿在产品定义树中的另一个级别而不是在xml输出级别上进行更改。

我在debian linux系统上尝试了xmldiff和xmlpatch,即使输入中包含新行,它也可以在版本2上明显地应用从版本1到版本1a的更改。 首先,您的文件应为正确的xml,count属性应使用引号引起来。我是手动完成的,但您可能会使用某些程序,例如python中的beautifulsoup。

这是我所做的。希望对您有所帮助。由于这些python程序是开放的,因此将其自动化以在文件的集合上运行将变得不难。

xmldiff ver1.xml ver1a.xml >ver1-diff
xmlpatch ver1-diff ver2.xml >ver2a.xml