Pregunta

Actualmente estoy intentando leer un archivo XML, realizar algunos cambios menores (alterar el valor de algunos atributos) y volver a escribirlo.

Tenía la intención de utilizar un analizador StAX (javax.xml.stream.XMLStreamReader) para leer en cada evento, ver si era uno que quería cambiar y luego pasarlo directamente al escritor StAX (javax.xml.stream.XMLStreamReader) si no se requerían 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 posible de elemento que puede ocurrir en un documento XML, y simplemente volver a escribirla, pero parece un gran problema para algo que parece que debería ser simple. .

¿Hay algo que me falta que facilite la escritura de un documento XML muy similar al que lees con StAX?

¿Fue útil?

Solución

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 tu pregunta:La diferencia entre transmisión y manejo de eventos, AFAIK, es control.Con la API de streaming puedes recorrer tu documento paso a paso y obtener el contenido que deseas.Mientras que con la API basada en eventos solo puedes manejar lo que te interesa.

Otros consejos

Después de jugar un poco, la respuesta parece ser usar las versiones de lector/escritor de eventos en lugar de las versiones de Stream.

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

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

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

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

que copia el evento actualmente señalado desde el lector de secuencias utilizando el escritor de secuencias.Esto no sólo es simple sino también muy eficiente.Lo he usado para modificaciones similares con éxito.

(¿Cómo obtener XMLStreamWriter2, etc.?Todas las instancias proporcionadas por Woodstox implementan estas versiones extendidas (además, hay contenedores en caso de que alguien quiera usar variantes "básicas" de Stax).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top