El mejor analizador XML para Java

Necesito leer archivos XML pequeños (pocos MB como máximo, con encoding UTF-8), revolver alrededor de varios elementos y atributos, tal vez modificar algunos y volver a escribir el XML en el disco (preferiblemente con un buen formateo con sangría) .

¿Cuál sería el mejor analizador de XML para mis necesidades? Hay muchos para elegir. Algunos que conozco son:

  • JDOM
  • Woodstox
  • XOM
  • dom4j
  • VTD-XML
  • Xerces-J
  • carmesí

Y, por supuesto, el que está en el JDK (estoy usando Java 6). Estoy familiarizado con Xerces, pero lo encuentro torpe.

Recomendaciones?

Si la velocidad y la memoria no son un problema, dom4j es una muy buena opción. Si necesita velocidad, usar un analizador StAX como Woodstox es la manera correcta, pero tiene que escribir más código para hacer las cosas y debe acostumbrarse a procesar XML en las transmisiones.

Creo que no debes considerar ninguna implementación de analizador específico. La API Java para procesamiento XML le permite usar cualquier implementación de analizador conforme de forma estándar. El código debería ser mucho más portátil, y cuando te das cuenta de que un analizador específico ha envejecido demasiado, puedes reemplazarlo por otro sin cambiar una línea de tu código (si lo haces correctamente).

Básicamente, hay tres formas de manejar XML de una manera estándar:

  • SAX Esta es la API más simple. Usted lee el XML al definir una clase Handler que recibe los datos dentro de los elementos / atributos cuando el XML se procesa en serie. Es más rápido y simple si solo planea leer algunos atributos / elementos y / o escribir algunos valores (su caso).
  • DOM Este método crea un árbol de objetos que le permite modificar / acceder de forma aleatoria, por lo que es mejor para la manipulación y manipulación complejas de XML.
  • StAX Esto está en el medio del camino entre SAX y DOM. Simplemente escribe código para extraer los datos del analizador que te interesa cuando se procesa.

Olvídese de API propietarias como JDOM o Apache (es decir, Apache Xerces XMLSerializer ) porque lo vinculará a una implementación específica que puede evolucionar a tiempo o perder compatibilidad con versiones anteriores, lo que le hará cambiar su código en el futuro cuando desee actualizar a una nueva versión de JDOM o cualquier analizador que use. Si te apegas a la API estándar de Java (usando fábricas e interfaces), tu código será mucho más modular y mantenible.

No es necesario decir que todos (no he comprobado todos, pero estoy casi seguro) de los analizadores propuestos cumplen con una implementación de JAXP, por lo que técnicamente puede usarlos todos, sin importar cuál.

Aquí hay una buena comparación en DOM, SAX, StAX y TrAX (Fuente: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

Característica StAX SAX DOM TrAX

Tipo de API Pull, streaming Push, transmisión en árbol de memoria XSLT Rule

Facilidad de uso Alto Medio Alto Medio

Capacidad XPath No No Sí Sí

CPU y memoria Bueno Bueno Varía Varía

Adelante solo Sí Sí No No

Leer XML Sí Sí Sí Sí Sí Sí

Escribir XML Sí No Sí Sí

CRUD No No Sí No

Simple XML http://simple.sourceforge.net/ es muy fácil para (de) serializar objetos.

Además de SAX y DOM, está disponible el análisis STaX utilizando XMLStreamReader, que es un analizador de extracción xml.

He encontrado que dom4j es la herramienta para trabajar con XML. Especialmente en comparación con Xerces.

No recomendaría esto, es que tienes mucho “pensando” en tu aplicación, pero usar XSLT podría ser mejor (y potencialmente más rápido con la comstackción de XSLT a bytecode) que la manipulación de Java.

Si le importa menos el rendimiento, soy un gran admirador de Apache Digester, ya que básicamente le permite mapear directamente desde XML a Java Beans.

De lo contrario, primero tiene que analizar y luego construir sus objetos.