簡體   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