将带有xinclude标记的多个XML文件连接到单个文件中

时间:2020-03-05 18:56:08  来源:igfitidea点击:

我正在IzPack中创建安装程序。它很大,我已经使用<xinclude>和<xfragment>标记适当地分解了XML文件。不幸的是,在构建安装程序时,IzPack不会将它们结合在一起。这要求我们使用安装程序打包文件,而这将无法正常工作。

我本来打算开始用Java编写工具来加载XML文件并将它们组合在一起,但是我不想浪费时间。

Java XML库是否提供对xinclude的本地处理?谷歌似乎没有出现太多。

如果我必须自己写这个,只是想和你们一起检查,没什么大不了的。谢谢。

XML格式,例如:
File1.xml

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<installation version="1.0">
<packs>      
    <pack name="Transaction Service" id="Transaction Service" required="no" >
        <xinclude href="example/File2.xml" />
    </pack>
</packs>

File2.xml

<xfragment>
    <file src="..." />
</xfragment>

File2不需要标准的XML标头。 xml文件在构建时进行解析,因为它指定的资源包含在安装程序中。没有包括实际的XML信息(写入文件的顺序,放置位置的信息,等等)。

我希望产生的是:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<installation version="1.0">
<packs>      
    <pack name="Transaction Service" id="Transaction Service" required="no" >
        <file src="..." />
    </pack>
</packs>

谢谢,我现在将开始在Java中一起鞭打它,但希望有人能给出一个简单的答案。

蒂姆·雷诺兹

解决方案

回答

我不确定java是否支持自动xinclude。但是我们将必须使用名称空间才能使其正常工作。因此,请勿使用&lt;xinclude ....>,而应使用:

<xi:xinclude xmlns:xi="http://www.w3.org/2001/XInclude" href="example/File2.xml" />

通常,所包含的文件也应仍包含xml标头。不需要例如具有相同的编码。

回答

如果我们无法使用xinclude且正在使用Ant,那么我建议我们使用XMLTask,这是Ant的插件任务。它会做很多聪明的事情,包括我们对从片段构造XML文件感兴趣的一件事。

例如

<xmltask source="templatefile.xml" dest="finalfile.xml">
  <insert path="/packs/pack[1]" position="under" file="pack1.xml"/>
</xmltask>

(以上警告是通过内存完成的,因此请查阅文档!)。

请注意,在上面,文件pack1.xml不必具有根节点。

回答

例如,Apache Xerces应该支持Xinclude,但是我们需要启用它。

http://xerces.apache.org/xerces2-j/faq-xinclude.html

import javax.xml.parsers.SAXParserFactory;

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setXIncludeAware(true);

他们的文档还说我们可以将其启用为功能

回答

现在可以使用:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<installation version="1.0">
<packs>      
    <pack name="Transaction Service" id="Transaction Service" required="no" >
        <xi:include href="example/File2.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
    </pack>
</packs>

示例/File2.xml

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<xfragment>
    <file src="..." />
</xfragment>