2

我正在 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>

文件2.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 把它搅在一起,但希望有人有一个简单的答案。

蒂姆雷诺兹

4

5 回答 5

1

如果你不能让 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 l 不必有根节点。

于 2008-09-16T16:33:25.843 回答
0

I'm not sure if java supports automatic xinclude. But you will have to use namespaces to make it work. So don't use <xinclude ....>, but use:

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

Normally the included file should still contain the xml header as well. There is no requirement for it to e.g. have the same encoding.

于 2008-09-16T15:01:35.500 回答
0

只为任何想知道的人。IzPack 使用 nanoXML 来解析所有配置文件。它没有命名空间。并且不处理 xml 包含。

为了解决我遇到的问题,我将“xinclude”等(片段/后备)元素添加到解析器内容中,以便它主要遵循 x:include 的标准(注意名称差异?)一个是正确的并且具有命名空间。另一个是一个讨厌的 hack,它假装遵循标准而不使用命名空间。

无论如何,这是很久以前的事了,现在 IzPack 使用了一个健全的 XML 解析器,并且了解您是否正确执行 xi:include 或您希望使用的任何前缀都没有问题。它是体面的 xml 解析器的标准。

于 2014-12-17T23:57:00.320 回答
0

例如,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);

他们的文档还说您可以将其作为一项功能启用

于 2009-02-10T20:35:12.850 回答
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>
于 2009-08-19T19:46:28.520 回答