2008-08-14 9 views
5

Ich versuche gerade, eine XML-Datei einzulesen, einige kleinere Änderungen vorzunehmen (den Wert einiger Attribute zu ändern) und sie wieder zu schreiben.Kleine Änderung an einem XML-Dokument mit StAX

Ich habe bestimmt einen StAX Parser (javax.xml.stream.XMLStreamReader) zu verwenden, in jedem Fall zu lesen, sehen, ob es eine war ich ändern wollte, und dann geradeaus weitergeben an den StAX Schreiber (javax.xml.stream.XMLStreamReader), wenn keine Änderungen erforderlich waren.

Leider sieht das nicht so einfach aus - Der Schreiber hat keine Möglichkeit, einen Ereignistyp und ein Parser-Objekt zu nehmen, 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 es einfach wieder zurückschreiben, aber es scheint eine Menge Ärger für etwas zu sein, das einfach zu sein scheint .

Gibt es etwas, das ich vermisse, das es einfach macht, ein sehr ähnliches XML-Dokument zu schreiben, das Sie mit StAX gelesen haben?

Antwort

2

StAX funktioniert sehr gut und ist sehr schnell. Ich habe es in einem Projekt verwendet, um XML-Dateien zu analysieren, die bis zu 20 MB groß sind. Ich habe keine gründliche Analyse, aber es war definitiv schneller als SAX.

Wie für Ihre Frage: Der Unterschied zwischen Streaming und Event-Handling, AFAIK ist Kontrolle. Mit der Streaming-API können Sie Schritt für Schritt durch Ihr Dokument gehen und den gewünschten Inhalt erhalten. Während die Event-basierte API können Sie nur mit was Sie interessiert sind.

3

Nach ein bisschen Muck, scheint die Antwort zu sein, die Event-Reader/Writer-Versionen zu verwenden, anstatt die Stream-Versionen.

(das heißt javax.xml.stream.XMLEventReader und javax.xml.stream.XMLEventWriter)

Siehe auch http://www.devx.com/tips/Tip/37795, das, was ich schließlich ist bekam bewegt.

2

Ich weiß, das ist ziemlich alt Frage, aber wenn jemand anderes für so etwas sucht, gibt es eine andere Alternative: Woodstox Stax2 Erweiterung API hat Methode :

, das das aktuell angegebene Ereignis aus Stream-Reader mit Stream Writer kopiert. Dies ist nicht nur einfach, sondern auch sehr effizient. Ich habe es für ähnliche Änderungen mit Erfolg verwendet.

(wie man XMLStreamWriter2 etc Alle Woodstox bereitgestellten Instanzen diese erweiterten Versionen implementieren - plus gibt es Wrapper, falls jemand will „basic“ Stax-Varianten verwenden, als auch)

Verwandte Themen