Modificări mici la un document XML utilizând StAX

În prezent, încerc să citesc într-un fișier XML, să fac modificări minore (modificarea valorii anumitor atribute) și să îl scriu din nou.

Am intenționat să folosesc un parser StAX ( javax.xml.stream.XMLStreamReader ) pentru a citi în fiecare eveniment, să văd dacă a fost unul pe care am vrut să îl schimb și apoi să îl dau direct scriitorului StAX ( javax.xml.stream.XMLStreamReader ) dacă nu au fost necesare modificări.

Din păcate, aceasta nu pare a fi atât de simplă - scriitorul nu are nici un fel de a lua un tip de eveniment și un obiect de analiză, doar metode precum writeAttribute și writeStartElement . Evident, aș putea să scriu o declarație de comutare mare cu un caz pentru fiecare tip de element posibil care poate apărea într-un document xml și să-l scriu din nou, dar se pare că este o mulțime de probleme pentru ceva care pare să fie simplu .

Există ceva ce lipsește, care face ușor să scrieți un document xml foarte asemănător celui pe care îl citiți cu StAX?

0
fr hi bn

3 răspunsuri

Dupa un pic de muck in jurul, raspunsul pare a fi de a folosi versiuni de cititor/scriitor de evenimente, mai degrabă decât versiunile Stream.

(adică javax.xml.stream.XMLEventReader și javax.xml.stream.XMLEventWriter)

Consultați, de asemenea, http://www.devx.com/tips/Tip/37795 , ceea ce mi-a făcut în cele din urmă să mă mișc.

0
adăugat

StAX funcționează destul de bine și este foarte rapid. Am folosit-o într-un proiect pentru a analiza fișierele xml de până la 20MB. Nu am o analiză amănunțită, dar era cu siguranță mai rapidă decât SAX.

În ceea ce privește întrebarea dvs.: Diferența dintre streaming și manipularea evenimentelor, AFAIK este de control. Cu API-ul de streaming puteți trece prin documentul dvs. pas cu pas și obțineți conținutul dorit. Întrucât API-ul pe bază de eveniment se poate ocupa doar ceea ce vă interesează.

0
adăugat

Știu că este o întrebare destul de veche, dar dacă cineva caută ceva de genul acesta, există o altă alternativă: extensia API Woodstox Stax2 are metodă:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

care copiază evenimentul indicat în prezent din cititorul de flux utilizând scriitorul fluxului. Acest lucru nu este doar simplu, dar foarte eficient. Am folosit-o pentru modificări similare cu succes.

(cum să obțineți XMLStreamWriter2 etc?) Toate instanțele furnizate de Woodstox implementează aceste versiuni extinse - plus există ambalaje în cazul în care cineva vrea să folosească variante de bază "de bază", de asemenea)

0
adăugat