将带有xinclude标记的多个XML文件连接到单个文件中
我正在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。但是我们将必须使用名称空间才能使其正常工作。因此,请勿使用<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>