2009-03-10 9 views
0

Ich möchte einige Fragmente einer XML-Datei in separaten Dateien speichern. Es scheint, es gibt keine Möglichkeit, es auf eine direkte Art und Weise zu tun: Lesen der Chunks schlägt fehl.Sind XML-Chunks gültig?

Ich bekomme immer die Ausnahme "javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: Das Markup im Dokument nach dem Wurzelelement muss wohlgeformt sein."

Es funktioniert nur, wenn es nur ein 'root' Element gibt (das ist nicht das Wurzelelement im normalen Sinne).

Ich verstehe, dass XML mit mehreren "Wurzeln" ist nicht gut gebildet, aber es sollte als ein Stück behandelt werden.

Bitte, bevor Sie einige Workaround-Lösungen vorschlagen, sagen Sie mir: Sind XML-Chunks überhaupt gültig?

Und wenn ja, können sie mit Standard-JDK6-API ausgelesen werden?

Prüfregeln:

String testChunk1 = "<e1>text</e1>"; 
String testChunk2 = "<e1>text</e1><e2>text</e2>"; 

// the following doesn't work with 'testChunk2' 
StringReader sr = new StringReader(testChunk1); 
StringWriter sw = new StringWriter(); 

TransformerFactory.newInstance().newTransformer().transform(
    new StreamSource(sr), new StreamResult(sw)); 

System.out.println(sw.toString()); 

Antwort

2

Das W3C wurde für XML fragment interchange auf, die einen Standard zu arbeiten. Ich erwähne es nicht, weil es eine Lösung für Ihr Problem ist, aber es ist definitiv relevant zu sehen, dass es Diskussionen darüber gibt, wie man mit solchen Dingen umgeht.

In der .NET-Welt können Sie mit XML-Fragmenten arbeiten und zum Beispiel validate them against a schema. Dies legt nahe, dass es sich lohnt, nach einer ähnlichen Unterstützung in den Java-Bibliotheken zu suchen.

Wenn Sie solche Fragmente mit XSLT transformieren wollen, ist es ein sehr gebräuchlicher Ansatz, ein Wrapper-Element um sie zu legen, das dann als Wurzel des DOM dienen kann.

+0

Die "aktuelle" Version des XML-Fragmentaustauschs stammt aus dem Jahr 2001 und ist immer noch eine "Kandidatenempfehlung" (seit 8 Jahren!). Also, ich denke, es gibt keine weitere Arbeit von W3C darauf zu erwarten. Ich konnte keine anderen Standardvorschläge des W3C zu ähnlichen Themen finden. Kennst du irgendwelche? Vielen Dank. –

1

Während ich dort nehme einen Weg geben muss, vielleicht kludgy, zu tun, was Sie wollen, ich bin mir nicht bewusst keiner Weise, es zu tun. Die Standard-XML-Parser erwarten wohlgeformtes XML, wie Sie feststellen.

Wenn Sie Ihre XML als eine Anzahl von separaten Fragmenten in verschiedenen Dateien speichern möchten, dann ist wahrscheinlich der beste Weg, dies zu tun, Ihren eigenen Reader oder InputStream zu erstellen, der tatsächlich (hinter den Kulissen) alle Fragmente liest Reihenfolge und geben Sie dann den umschlossenen Reader oder InputStream an den Transformator weiter. Auf diese Weise sieht der XML-Parser ein einzelnes XML-Dokument, das Sie jedoch beliebig speichern können.

Wenn Sie etwas tun, die Fragmente (mit Ausnahme des ersten) nicht mit den Standard-XML-Header beginnen:

<?xml version="1.0" encoding="UTF-8" ?> 
+0

Eigentlich kann er einige Input erstellen, die XML-Dateien mit und ohne XML liest Header und kombiniert sie in eine einzige XML-Datei, die eine Kopfzeile hat. – Bombe

+0

Ich habe darüber nachgedacht, aber das würde ich eine Work-Around-Lösung nennen;) Ich denke, ich werde dies als letzte Option verwenden. –

1

Bitte, bevor Sie einige Lösungen vorschlagen, sagen Sie mir: Sind XML-Chunks überhaupt gültig?

Nicht in ihrem eigenen Recht.

Sie können sie (z. B. als extern geparste XML-Entitäten) in andere Dokumente über Methoden wie Entitätsreferenz einbeziehen und sie mithilfe von Methoden wie DOM Level 3 LS parseWithContext() als Chunks in vorhandene Dokumente analysieren Java gibt es nicht, sorry), aber sie sind keine Dokumente, daher können Interfaces, die ein vollständiges Dokument benötigen, diese nicht akzeptieren.

Transformer benötigt ein vollständiges Dokument als Eingabe, da XSLT mit vollständigen Dokumenten arbeitet und durch etwas verwirrt wäre, das null oder mehr als ein Wurzelelement enthält. Der übliche Trick besteht darin, ein einzelnes Wurzelelement zu erstellen, indem das Dokument in Start- und End-Tags eingeschlossen wird. Dies bedeutet jedoch, dass Sie keine XML-Deklaration (*) haben können, wie von Eddie erwähnt.

(*: Eigentlich ist es als ‚Text-Erklärung‘ bekannt, wenn sie in einem externen analysierten Entity enthalten, aber die Syntax ist genau das gleiche.)

Verwandte Themen