2008-08-14 16 views
5

Actualmente estoy tratando de leer en un archivo XML, hacer algunos cambios menores (alterar el valor de algunos atributos) y volver a escribirlo.Pequeña modificación en un documento XML con StAX

tengo la intención de utilizar un analizador StAX (javax.xml.stream.XMLStreamReader) para leer en cada caso, ver si era uno quería cambiar, y luego pasarlo directamente a la escritora StAX (javax.xml.stream.XMLStreamReader) si se requieren cambios.

Desafortunadamente, eso no parece ser tan simple: el escritor no tiene forma de tomar un tipo de evento y un objeto analizador, solo métodos como writeAttribute y writeStartElement. Obviamente, podría escribir una declaración de cambio grande con un caso para cada tipo de elemento posible que pueda ocurrir en un documento XML, y simplemente volver a escribirlo, pero parece ser un montón de problemas para algo que parece que debería ser simple .

¿Hay algo que me falta que hace que sea fácil escribir un documento XML muy similar al que leyó con StAX?

Respuesta

2

StAX funciona bastante bien y es muy rápido. Lo usé en un proyecto para analizar archivos XML de hasta 20 MB. No tengo un análisis exhaustivo, pero definitivamente fue más rápido que SAX.

En cuanto a su pregunta: La diferencia entre la transmisión y el manejo de eventos, AFAIK es el control. Con la API de transmisión puede recorrer su documento paso a paso y obtener los contenidos que desea. Mientras que la API basada en eventos solo puede manejar lo que le interesa.

3

Después de un poco de rebuscar, la respuesta parece ser utilizar las versiones de lector/grabador de eventos en lugar de las versiones de Stream.

(es decir javax.xml.stream.XMLEventReader y javax.xml.stream.XMLEventWriter)

Véase también http://www.devx.com/tips/Tip/37795, que es lo que finalmente me hizo mover.

2

Sé que esta es una pregunta bastante antigua, pero si alguien más está buscando algo como esto, existe otra alternativa: API de extensión Woodstox Stax2 tiene un método :

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

que copia el evento actualmente apuntado desde el lector de flujo utilizando la grabadora de flujo. Esto no es solo simple sino muy eficiente. Lo he usado para modificaciones similares con éxito.

(cómo obtener XMLStreamWriter2 etc proporcionados por Woodstox todas las instancias implementar estas versiones extendidas -? Además, hay envolturas en caso de que alguien quiere utilizar variantes "básicos" Stax, también)

Cuestiones relacionadas