Angenommen, ich möchte eine große Menge von Suchergebnissen als XML in einen PrintWriter oder einen OutputStream mit XOM ausgeben. Das resultierende XML würde wie folgt aussehen:Wie streamen XML-Daten mit XOM?
<?xml version="1.0" encoding="UTF-8"?>
<resultset>
<result>
[child elements and data]
</result>
...
...
[1000s of result elements more]
</resultset>
Da das resultierende XML-Dokument groß sein könnte (Hunderte von Megabytes, vielleicht), ich will es in einem Streaming-Mode-Ausgang (anstelle das gesamte Dokument im Speicher zu schaffen und dann schreibe ich das).
Die Granularität der Ausgabe von einem <result>
zu einem Zeitpunkt ist in Ordnung, also möchte ich einen <result>
nach dem anderen erzeugen, und schreibe es in den Strom. Mit anderen Worten, ich würde einfach gerne so etwas wie dieser Pseudo-Code tun (automatische Spülung aktiviert ist, also keine Sorge darüber):
open stream/writer
write declaration
write start tag for <resultset>
while more results:
write next <result> element
write end tag for <resultset>
close stream/writer
Ich habe bei Serializer
, aber die notwendigen Methoden suchen, writeStartTag(Element)
, writeEndTag(Element)
, write(DocType)
sind geschützt, nicht öffentlich! Gibt es keinen anderen Weg, als den Serializer von der Unterklasse zu trennen, um diese Methoden verwenden zu können, oder um die Start- und End-Tags manuell als Strings in den Stream zu schreiben und dabei XOM zu umgehen? (Letzteres wäre in diesem einfachen Beispiel nicht allzu schlecht, aber im allgemeinen Fall würde es ziemlich hässlich werden.)
Fehle ich etwas oder ist XOM einfach nicht dafür gemacht?
Mit dom4j könnte ich dies tun leicht XMLWriter
mit - es Konstrukteuren hat, dass ein Writer
oder OutputStream
nehmen und Methoden writeOpen(Element)
, writeClose(Element)
, writeDocType(DocumentType)
usw. vergleichen zu XOM der Serializer
wo die einzige öffentliche write
Methode derjenige ist, der eine nimmt ganz Document
.
(Dies ist auf my question about the best dom4j replacement bezogen, wo XOM ein starker Anwärter ist.)
Ja, ich dachte, dass es so machbar sein sollte, aber nie herumkommen, es zu versuchen. Danke für die Bestätigung! In gewisser Hinsicht ist dies vorzuziehen, wenn man eine weitere Bibliothek von Drittanbietern (vgl. Peters Antwort) einführt, um einfach zu streamen. (Immerhin schade, dass XOM nicht mit diesem eingebauten kommt.) – Jonik
In beiden Punkten vereinbart. –
Schön. Ich mag deine Lösung und werde es nächstes Mal versuchen, wenn ich sie brauche. –