我正在IzPack中创建一个安装程序。它非常大,我使用< xinclude>正确地分解了我的XML文件。和< xfragment>标签。不幸的是,在构建安装程序时,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编写它,但希望有人有一个简单的答案。
蒂姆雷诺兹答案 0 :(得分:1)
如果你不能让xinclude工作并且你正在使用Ant,我建议XMLTask,这是Ant的插件任务。它会做很多聪明的事情,包括你感兴趣的一件事 - 用片段构建XML文件。
e.g。
<xmltask source="templatefile.xml" dest="finalfile.xml">
<insert path="/packs/pack[1]" position="under" file="pack1.xml"/>
</xmltask>
(警告 - 以上内容是从内存中完成的,所以请查阅文档!)。
请注意,在上文中,文件 pack1.xm l不必具有根节点。
答案 1 :(得分:0)
我不确定java是否支持自动xinclude。但是您必须使用命名空间才能使其工作。所以不要使用<xinclude ....>
,而是使用:
<xi:xinclude xmlns:xi="http://www.w3.org/2001/XInclude" href="example/File2.xml" />
通常,包含的文件仍应包含xml标头。没有要求例如具有相同的编码。
答案 2 :(得分:0)
http://xerces.apache.org/xerces2-j/faq-xinclude.html
import javax.xml.parsers.SAXParserFactory;
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setXIncludeAware(true);
他们的文档还说您可以将其作为feature
启用答案 3 :(得分:0)
现在可以使用:
<?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>
答案 4 :(得分:0)
只为想要了解的人。 IzPack使用nanoXML来解析所有配置文件。它没有名称空间。并且不处理xml包含。
为了解决我遇到的问题,我将“xinclude”等(片段/回退)元素添加到解析器的内容中,使其大部分遵循x的标准:include(注意名称差异?)一个是正确的并且有命名空间。另一个是讨厌的黑客,假装遵循标准而不使用命名空间。
无论如何这是很久以前的事情,现在IzPack使用一个理智的XML解析器并理解你是否正确地执行了xi:include或者你想要使用的任何前缀都没有问题。它是体面的xml解析器的标准。