XML配置继承,避免重复

时间:2018-01-15 15:58:52

标签: xml maven ant

想象一下,当你有大约10个以上的大型XML配置文件用于几乎相同的多个环境时。

有时您必须添加一个新选项,这会导致使用相同数据修改所有10..20..30 +文件。

你犯了错误。 与其他分支合并时会出现冲突。 你感到紧张和沮丧。

是否有任何好的工具可以为纯XML文件(不是Spring.cgf或POM)提供继承?

或者我必须自己写一个蚂蚁或maven自行车脚本?

2 个答案:

答案 0 :(得分:2)

您可以使用实体/实体引用在文件内或文件之间的多个位置引用和重用内容。

声明和使用实体的XML文件如下所示:

<!DOCTYPE doc [
  <!ENTITY myent "<x>Text content of myent</x>">
]>
<doc>
  &myent;
  &myent;
</doc>

此XML文件的处理方式与

相同
<doc>
  <x>Text content of myent</x>
  <x>Text content of myent</x>
</doc>

已被指定。也就是说,实体引用&myent;被替换文本<x>Text content of myent</x>替换。

这也适用于存储在外部文件(称为外部实体)中的替换文本。假设上面的文件存储为doc.xml,您可以从另一个XML文件中引用它,如下所示:

<!DOCTYPE otherdoc [
  <!ENTITY doc SYSTEM "doc.xml">
]>
<otherdoc>
  &doc;
</otherdoc>

并且XML解析器会将其视为

<otherdoc>
  <doc>
    <x>Text content of myent</x>
    <x>Text content of myent</x>
  </doc>
</otherdoc>

已被指定。

使用实体,您可以组织常见的XML内容,而不会在文件内或文件之间存在冗余。希望有所帮助。

编辑:请注意,您必须调整DOCTYPE - 它必须与XML的文档元素相匹配

答案 1 :(得分:2)

您可以维护一个生成多个配置文件的XSLT脚本,如下所示:

<xsl:transform version='3.0' expand-text='true'....>

<xsl:variable name="outputs" as="element(output)*">
  <output file="config1.xml" os="mac" db="oracle"/>
  <output file="config2.xml" os="windows" db="mysql"/>
</xsl:variable>

<xsl:template name="main">
  <xsl:for-each select="$outputs">
    <xsl:result-document href="{$file}">
      <config>
        <aspiration>high</aspiration>
        <perspiration>low</perspiration>
        <condensation>{if (@db='oracle') then 'moderate' else 'none'}</condensation>
        <xsl:if test="@os='linux'>
          <permutation>inverse</permutation>
        </xsl:if>
     </config>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>

</xsl:transform>

然后当有更改时,只需编辑样式表并重新运行。

或者,您可以使用条件标记创建配置文件,如下所示:

<config>
  <perspiration>high</perspiration>
  <exhumation for-os="linux">mediocre</exhumation>
  <exhumation for-os="windows">none</exhumation>
  ...
</config>

然后通过删除不适用的元素来编写样式表以对其进行子集化。