繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM