Domanda

Attualmente sto provando a leggere un file XML, apportare alcune modifiche minori (alterare il valore di alcuni attributi) e riscriverlo di nuovo.

Ho intenzione di utilizzare un parser StAX (javax.xml.stream.XMLStreamReader) da leggere in ogni evento, vedere se era quello che volevo modificare e poi passarlo direttamente allo scrittore StAX (javax.xml.stream.XMLStreamReader) se non fossero necessarie modifiche.

Sfortunatamente, non sembra essere così semplice: lo scrittore non ha modo di prendere un tipo di evento e un oggetto parser, solo metodi come writeAttribute E writeStartElement.Ovviamente potrei scrivere una grande istruzione switch con un caso per ogni possibile tipo di elemento che può verificarsi in un documento XML, e semplicemente riscriverla di nuovo, ma sembra un sacco di problemi per qualcosa che sembra dovrebbe essere semplice .

C'è qualcosa che mi manca che renda facile scrivere un documento XML molto simile a quello letto con StAX?

È stato utile?

Soluzione

StAX funziona abbastanza bene ed è molto veloce.L'ho usato in un progetto per analizzare file XML fino a 20 MB.Non ho un'analisi approfondita, ma era decisamente più veloce di SAX.

Per quanto riguarda la tua domanda:La differenza tra streaming e gestione degli eventi, AFAIK è il controllo.Con l'API di streaming puoi percorrere il tuo documento passo dopo passo e ottenere i contenuti che desideri.Mentre con l'API basata su eventi puoi gestire solo ciò che ti interessa.

Altri suggerimenti

Dopo aver riflettuto un po', la risposta sembra essere quella di utilizzare le versioni di lettura/scrittura di eventi anziché le versioni di flusso.

(cioè.javax.xml.stream.XMLEventReader e javax.xml.stream.XMLEventWriter)

Guarda anche http://www.devx.com/tips/Tip/37795, che è ciò che finalmente mi ha fatto muovere.

So che questa è una domanda piuttosto vecchia, ma se qualcun altro sta cercando qualcosa del genere, c'è un'altra alternativa:L'API di estensione Woodstox Stax2 ha il metodo:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

che copia l'evento attualmente puntato dal lettore di flusso utilizzando lo scrittore di flusso.Questo non è solo semplice ma molto efficiente.L'ho usato per modifiche simili con successo.

(come ottenere XMLStreamWriter2 ecc?Tutte le istanze fornite da Woodstox implementano queste versioni estese, inoltre ci sono dei wrapper nel caso qualcuno voglia utilizzare anche varianti Stax "di base"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top