Frage

Ich versuche gerade, eine XML-Datei einzulesen, einige kleinere Änderungen vorzunehmen (den Wert einiger Attribute zu ändern) und sie wieder herauszuschreiben.

Ich hatte vor, einen StAX-Parser zu verwenden (javax.xml.stream.XMLStreamReader), um jedes Ereignis einzulesen, zu sehen, ob es eines war, das ich ändern wollte, und es dann direkt an den StAX-Autor weiterzuleiten (javax.xml.stream.XMLStreamReader), wenn keine Änderungen erforderlich waren.

Leider scheint das nicht so einfach zu sein – der Autor hat keine Möglichkeit, einen Ereignistyp und ein Parser-Objekt zu übernehmen, sondern nur Methoden wie writeAttribute Und writeStartElement.Natürlich könnte ich eine große Switch-Anweisung mit einem Fall für jeden möglichen Elementtyp schreiben, der in einem XML-Dokument vorkommen kann, und sie einfach wieder zurückschreiben, aber es scheint eine Menge Ärger für etwas zu sein, das einfach zu sein scheint .

Fehlt mir etwas, das es einfach macht, ein XML-Dokument zu schreiben, das dem, das Sie mit StAX eingelesen haben, sehr ähnlich ist?

War es hilfreich?

Lösung

StAX funktioniert ziemlich gut und ist sehr schnell.Ich habe es in einem Projekt verwendet, um XML-Dateien mit einer Größe von bis zu 20 MB zu analysieren.Ich habe keine gründliche Analyse, aber es war definitiv schneller als SAX.

Was deine Frage betrifft:Der Unterschied zwischen Streaming und Event-Handling, AFAIK, ist die Kontrolle.Mit der Streaming-API können Sie Ihr Dokument Schritt für Schritt durchgehen und die gewünschten Inhalte erhalten.Mit der ereignisbasierten API hingegen können Sie nur das verarbeiten, woran Sie interessiert sind.

Andere Tipps

Nach einigem Hin und Her scheint die Antwort darin zu bestehen, die Event-Reader/Writer-Versionen anstelle der Stream-Versionen zu verwenden.

(d. h.javax.xml.stream.XMLEventReader und javax.xml.stream.XMLEventWriter)

Siehe auch http://www.devx.com/tips/Tip/37795, was mich endlich in Bewegung brachte.

Ich weiß, dass dies eine ziemlich alte Frage ist, aber wenn jemand anderes nach so etwas sucht, gibt es eine andere Alternative:Die Woodstox Stax2-Erweiterungs-API hat die Methode:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

Dadurch wird das Ereignis, auf das aktuell verwiesen wird, mithilfe des Stream-Writers vom Stream-Reader kopiert.Das ist nicht nur einfach, sondern auch sehr effizient.Ich habe es für ähnliche Modifikationen mit Erfolg verwendet.

(Wie bekomme ich XMLStreamWriter2 usw.?Alle von Woodstox bereitgestellten Instanzen implementieren diese erweiterten Versionen – außerdem gibt es Wrapper für den Fall, dass jemand auch „einfache“ Stax-Varianten verwenden möchte)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top