2008-08-14 18 views
5

Obecnie próbuję odczytać plik XML, wprowadzić drobne zmiany (zmienić wartość niektórych atrybutów) i ponownie je zapisać.Mała modyfikacja dokumentu XML przy użyciu StAX

Mam zamiar użyć parsera StAX (javax.xml.stream.XMLStreamReader), aby przeczytać w każdym wydarzeniu, sprawdzić, czy to był ten, który chciałem zmienić, a następnie przekazać go bezpośrednio do StAX pisarz (javax.xml.stream.XMLStreamReader), jeśli nie było żadnych zmian.

Niestety, nie wydaje się to takie proste - autor nie ma możliwości pobrania typu zdarzenia i obiektu analizatora składni, a jedynie metody takie jak writeAttribute i writeStartElement. Oczywiście mógłbym napisać dużą instrukcję switch ze sprawą dla każdego możliwego typu elementu, który może wystąpić w dokumencie XML, i po prostu napisać go ponownie, ale wydaje się, że jest dużo problemów dla czegoś, co wydaje się być proste .

Czy jest coś, czego mi brakuje, co ułatwia napisanie bardzo podobnego dokumentu XML do tego, który czytasz ze StAX?

Odpowiedz

2

StAX działa całkiem nieźle i jest bardzo szybki. Użyłem go w projekcie do parsowania plików XML, które mają do 20 MB. Nie mam dogłębnej analizy, ale była zdecydowanie szybsza od SAX.

Co do pytania: Różnica między transmisją strumieniową a obsługą zdarzeń, AFAIK to kontrola. Dzięki strumieniowemu API możesz krok po kroku przeglądać dokument i uzyskiwać pożądane treści. Natomiast API opartego na zdarzeniach można obsłużyć tylko to, co cię interesuje.

3

Po odrobinie grzebania, wydaje się, że odpowiedź polega na użyciu wersji czytnika/pisarza zdarzeń, a nie wersji Stream.

(tj javax.xml.stream.XMLEventReader i javax.xml.stream.XMLEventWriter)

Zobacz również http://www.devx.com/tips/Tip/37795, czyli to, co w końcu mi się poruszać.

2

Wiem, że to raczej stare pytanie, ale jeśli ktoś szuka czegoś podobnego, jest jeszcze jedna alternatywa: rozszerzenie Woodstox Stax2 API ma metodę :

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

, która kopiuje aktualnie wskazywane zdarzenie z czytnika strumienia przy użyciu programu piszącego strumienie. Jest to nie tylko proste, ale bardzo wydajne. Z powodzeniem używam go do podobnych modyfikacji.

(jak dostać XMLStreamWriter2 etc Wszystko Woodstox-przewidziane przypadki wdrożyć te rozszerzone wersje - plus jest owijarki w przypadku gdy ktoś chce używać „Basic” warianty Stax, jak również)

Powiązane problemy