想象一下,当你有大约10个以上的大型XML配置文件用于几乎相同的多个环境时。
有时您必须添加一个新选项,这会导致使用相同数据修改所有10..20..30 +文件。
你犯了错误。 与其他分支合并时会出现冲突。 你感到紧张和沮丧。
是否有任何好的工具可以为纯XML文件(不是Spring.cgf或POM)提供继承?
或者我必须自己写一个蚂蚁或maven自行车脚本?
答案 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>
然后通过删除不适用的元素来编写样式表以对其进行子集化。