El mejor analizador XML para Java [cerrado]

387

Necesito leer archivos XML pequeños (pocos MB como máximo, codificados con UTF-8), revolver buscando varios elementos y atributos, quizás modificar algunos y volver a escribir el XML nuevamente en el disco (preferiblemente con un formato agradable e indentado) .

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

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

Recomendaciones?

Evan
fuente
66
Creo que puedes encontrar más jugadores aquí: xml.com/lpt/a/1703
dma_k
1
Creo que hay problemas reales con esta pregunta. 1 es que se compara totalmente a diferencia de cosas, agrupando analizadores (xerces, carmesí) junto con bibliotecas de manipulación de dom (dom4j, xom, jdom). Además, las respuestas tienden a la promoción y no son tan constructivas.
Nathan Hughes
51
+220 y no constructivo. Claramente, los moderadores y usuarios tienen diferentes perspectivas sobre lo que es constructivo.
tbroberg
55
Sí, parece que las modificaciones son miopes cuando se trata de preguntas como esta. Sí, las respuestas serían obstinadas pero definitivamente basadas en la experiencia y la mayoría de las veces las respuestas se cuantifican. Los mods deben crear probablemente una etiqueta diferente para mover estas preguntas que están abiertas a discusión, lo que resulta en críticas constructivas y resultados.
Ashraff Ali Wahab
@dma_k tu enlace no funciona.
gaurav

Respuestas:

81

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 forma correcta, pero debe escribir más código para hacer las cosas y acostumbrarse a procesar XML en secuencias.

Zehrer
fuente
66
dom4j es bastante bueno, pero definitivamente no está exento de problemas. Para obtener buenas alternativas de dom4j, consulte stackoverflow.com/questions/831865/…
Jonik
@zehrer ¿son seguros para subprocesos?
gaurav
257

Creo que no deberías considerar ninguna implementación específica del analizador. Java API for XML Processing le permite usar cualquier implementación de analizador conforme de manera 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 manera estándar:

  • SAX Esta es la API más simple. Usted lee el XML definiendo 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 más 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 modificarlo / accederlo aleatoriamente, por lo que es mejor para la manipulación y manipulación de XML complejo.
  • StAX Esto está en el medio de la ruta entre SAX y DOM. Simplemente escriba código para extraer los datos del analizador que le interesa cuando se procesa.

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

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

Fernando Miguélez
fuente
11
En realidad, 3 formas: StAX (javax.xml.stream) es el tercer estándar.
StaxMan el
1
java-samples.com/showtutorial.php?tutorialid=152 (personalmente amo a SAX)
kitokid
@kitokid Chrome me dice que esa página tiene cosas desagradables. En su lugar, utilicé esto: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington
Buena descripción general: solo una cosa con la que no estoy de acuerdo, mientras que para incremental / streaming, SAX y Stax son buenos, API estándar suficiente, para DOM este no es el caso (IMO): hay razones válidas para tomas específicas de Java como XOM, JDOM y DOM4J: DOM independiente del lenguaje es bastante engorroso de usar.
StaxMan
130

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

API Type                 Pull, streaming Push, streaming En árbol de memoria Regla XSLT

Facilidad de uso           Alto Medio Alto Medio

Capacidad XPath    No No Sí Sí

CPU y memoria     Buena Buena Varía Varía

Reenviar solo        Sí Sí No No

Leer XML              Sí Sí Sí Sí

Escribir XML              Sí No Sí Sí

CRUDO                      No No Sí No

Kadir
fuente
77
Puede escribir XML con SAX. El receptor proporciona una implementación de controlador en la que el usuario puede llamar a eventos SAX para generar una salida XML. (Veo que la tabla es de origen y no material original, aunque la tabla está mal)
Dev
4

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


fuente
3

He encontrado que dom4j es la herramienta para trabajar con XML. Especialmente comparado con Xerces.

Brian Matthews
fuente
2

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


fuente
3
Mejor, posible: más rápido, muy poco probable.
StaxMan
Leer, manipular y escribir XML es exactamente lo que XSLT está diseñado para hacer. Esta es una buena respuesta lista para usar.
james.garriss
1

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

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

Uri
fuente
No necesito hacer Java Beans, solo manipular un poco los elementos XML sin procesar y revisar ciertos elementos para obtener datos de ellos, por lo que un analizador de estilo DOM es probablemente mi solución ideal.
Evan
Sí, dom4j probablemente sería una mejor solución allí ... Solía ​​usarlo mucho, hasta que subí un nivel al digestor
Uri