[英]Join multiple XML files with xinclude tags into single file
我正在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中一起鞭打它,但希望有人能给出一个简单的答案。
蒂姆·雷诺兹(Tim Reynolds)
如果您无法使用xinclude且正在使用Ant,那么我建议您使用XMLTask ,这是Ant的插件任务。 它会做很多聪明的事情,包括您感兴趣的一件事-从片段构造XML文件。
例如
<xmltask source="templatefile.xml" dest="finalfile.xml">
<insert path="/packs/pack[1]" position="under" file="pack1.xml"/>
</xmltask>
(警告-以上内容是通过内存完成的,因此请查阅文档!)。
请注意,在上面,文件pack1.xm l不必具有根节点。
现在可以使用:
<?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>
只适合想要知道的人。 IzPack使用nanoXML解析所有配置文件。 它没有名称空间。 并且不处理xml包含。
为了解决一个问题,我在解析器内容中添加了“ xinclude”等(片段/后备)元素,以便该元素大部分遵循x:include的标准(注意名称差异?)。这是正确的,并且具有名称空间。 另一个是讨厌的黑客,它假装遵循标准而不使用名称空间。
无论如何,这是很久以前的事了,现在IzPack使用了健全的XML解析器,并且了解xi:include或您希望使用的任何前缀是否正确实现了,所以没有问题。 它在体面的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);
他们的文档还说您可以将其启用为功能
我不确定java是否支持自动xinclude。 但是您将必须使用名称空间才能使其正常工作。 因此,请勿使用<xinclude ....>
,而应使用:
<xi:xinclude xmlns:xi="http://www.w3.org/2001/XInclude" href="example/File2.xml" />
通常,所包含的文件也应仍包含xml标头。 不需要例如具有相同的编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.