2008-09-16 20 views
2

Ich erstelle ein Installationsprogramm in IzPack. Es ist ziemlich groß, und ich habe meine XML-Dateien mit <xinclude> und <xfragment> Tags ordnungsgemäß aufgeteilt. Leider kombiniert IzPack sie nicht, wenn Sie Ihr Installationsprogramm erstellen. Dazu müssen Sie die Dateien mit dem Installer packen, was einfach nicht funktioniert.Verknüpfen Sie mehrere XML-Dateien mit xinclude-Tags in einer einzigen Datei

Ich wollte gerade ein Tool in Java schreiben, um die XML-Dateien zu laden und zu kombinieren, aber ich möchte das Rad nicht neu erfinden.

Gewährleisten die Java XML-Bibliotheken die native Behandlung von xinclude? Ein Google schien nicht viel aufzutauchen.

Keine große Sache, wenn ich das selbst schreiben muss, wollte nur mit euch zu überprüfen. Vielen Dank.

Format von XML zum Beispiel Zwecke: 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 braucht nicht die Standard-XML-Header. Die XML-Datei wird zum Zeitpunkt der Erstellung analysiert, da die angegebenen Ressourcen im Installationsprogramm enthalten sind. Was nicht enthalten ist, ist die tatsächliche XML-Informationen (um die Dateien zu schreiben, wo sie usw. zu setzen)

Was ich suche produziert haben:

<?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> 

Danke, ich werde anfangen jetzt zusammen in Java peitschen, aber hoffentlich hat jemand eine einfache Antwort.

Tim Reynolds

+0

Ich experimentiere mit http://www.xom.nu/, um XIncludes durchzuführen. Hast du es jemals zur Arbeit gebracht? – jon077

Antwort

0

Ich bin mir nicht sicher, ob Java automatische xinclude unterstützt. Aber Sie müssen Namespaces verwenden, damit es funktioniert. So verwenden Sie nicht <xinclude ....>, aber Gebrauch:

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

Normalerweise wird die Datei enthalten noch die XML-Header als auch enthalten. Es besteht keine Notwendigkeit dafür z.B. haben die gleiche Codierung.

+0

Leider unterstützt IzPack keine Namespaces. http://izpack.org/documentation/installation-files.html#xinclude-style-constructs Aber wissen, dass ich nicht erwarten kann, dass es automatisch mit Java behandelt wird, ist gut zu wissen. Ich gehe gerade durch die IzPack-Quelle. Sie benutzen NanoXML ... –

1

Wenn Sie xinclude nicht zum Arbeiten bringen können und Sie Ant verwenden, empfehle ich XMLTask, die eine Plugin-Aufgabe für Ant ist. Es wird viele clevere Sachen machen, einschließlich der einen Sache, an der Sie interessiert sind - das Konstruieren einer XML-Datei aus Fragmenten.

z.B.

<xmltask source="templatefile.xml" dest="finalfile.xml"> 
    <insert path="/packs/pack[1]" position="under" file="pack1.xml"/> 
</xmltask> 

(Warnung - das oben genannte erfolgt aus dem Speicher, bitte beachten Sie die Dokumentation!).

Beachten Sie, dass die Datei pack1.xm l oben keinen Wurzelknoten haben muss.

0

Apache Xerces zum Beispiel sollte Xinclude unterstützen, aber Sie müssen es aktivieren.

http://xerces.apache.org/xerces2-j/faq-xinclude.html

import javax.xml.parsers.SAXParserFactory; 

SAXParserFactory spf = SAXParserFactory.newInstance(); 
spf.setNamespaceAware(true); 
spf.setXIncludeAware(true); 

Die Dokumentation sagt auch Sie es als feature aktivieren

0

Das funktioniert jetzt:

<?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> 

Beispiel/File2.xml

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> 
<xfragment> 
    <file src="..." /> 
</xfragment> 
0

Nur für jeden, der es wissen möchte. IzPack hat nanoXML verwendet, um alle Konfigurationsdateien zu analysieren. Es hat keine Namespaces. Und behandelt keine XML-Includes.

Um ein Problem zu lösen Ich hatte ich das "xinclude" etc (Fragment/Fallback) -Element zu den Parser Zeug hinzugefügt, so dass es meist die Standards für x: include (beachten Sie den Namensunterschied?) Eins ist richtig und hat einen Namensraum. Der andere ist ein hässlicher Hack, der vorgibt, dem Standard zu folgen, ohne Namespaces zu verwenden.

Wie auch immer, das ist lange her und jetzt IzPack verwendet einen gesunden XML-Parser und versteht, wenn Sie es richtig tun xi: include oder was auch immer Präfix Sie verwenden möchten, sind keine Probleme. Es ist Standard in anständigen XML-Parsern.