¿Cuál es la mejor clase en Java para trabajar con documentos XML?Mejor clase de manejo de XML en Java
Respuesta
Realmente depende de lo que quiera hacer con el documento XML y de la importancia de los documentos.
grandes rasgos, se puede categorizar API XML como:
- API DOM - cargar todo el documento en la memoria, lo que limita el tamaño del documento se puede procesar, pero luego puede crear estructuras optimizadas para la navegación y transformación
- API de transmisión - su aplicación debe interpretar eventos de análisis de bajo nivel (por ejemplo, inicio del elemento, final del elemento, etc.) pero no está limitado por la memoria. Hay dos tipos de API de transmisión: push y pull. Los analizadores sintácticos disparan los eventos de análisis en un objeto que usted defina y ese objeto debe hacer un seguimiento del estado de análisis actual, con una máquina de estado o pila, por ejemplo). Los analizadores de extracción permiten a su aplicación extraer eventos de análisis del analizador. Esto hace que sea más fácil escribir un analizador de bajadas recursivo para procesar el contenido XML, pero luego el tamaño de la pila se convierte en un límite en el tamaño del documento que puede procesar.
- XML Mappers - asigna contenido XML a objetos Java. Hay dos enfoques principales para el mapeo XML: code-gen o reflection. Los mapeadores Code-gen generan clases Java a partir de un esquema XML, lo que significa que no tiene que duplicar la estructura del esquema en el código Java, pero tiene la desventaja de que su código Java refleja exactamente la estructura del esquema. Además, la mayoría de los generadores de código crean clases NOJO que son incómodas para trabajar y no tienen ningún comportamiento propio. Los mapeadores reflexivos le permiten escribir clases Java con un comportamiento rico y luego definir cómo se asignan a/desde XML. Si necesita ajustarse a un esquema predefinido, deberá asegurarse de que las clases y la configuración de la asignación sean correctas w.r.t. ese esquema
Algunas opciones disponibles son:
- API DOM: El DOM APIs en la biblioteca estándar son estándar (obviamente!) Y así interoperar con otras bibliotecas, sino que es horrible. Hay varias API más convenientes similares a DOM, como XOM (mi favorita por las mismas razones que da Adam Batkin arriba) o JDOM. Eche un vistazo a algunos y decida qué API prefiere.
- API de transmisión: la biblioteca estándar contiene una implementación del analizador de inserción SAX. El analizador de extracción estándar para Java es StAX.
- API de mapeo: JAXB es un estándar JSR pero prefiero XStream porque puedo separar más fácilmente la configuración de mapeo de las clases mapeadas (sin necesidad de anotaciones o configuración XML) y mapea objetos a/desde otros formatos de datos.
+1 por: depende "- y de lo que depende. –
VTD-XML es mejor que dom sax, y tire aquí es la prueba: http://sdiwc.us/digitlib/journal_paper.php?paper=00000582 .pdf –
Creo que es JDOM para facilitar su uso.
Hay muchas bibliotecas que le permiten manejar XML de diferentes maneras, y ninguna forma es "lo mejor". Como siempre, depende de lo que intenta hacer y cuáles son sus requisitos.
Cuando necesito un analizador DOM-like, o para compilar documentos XML, me gusta personalmente XOM, ya que garantiza que los documentos XML están bien formados y son "correctos". Su prioridad número uno es la corrección, que es importante cuando se interopera con otros sistemas, algo que XML hace muy bien. Su API también está muy bien diseñada e intuitiva, lo que hace que las operaciones comunes sean muy fáciles.
Encuentro dom4j para destacarme de cualquier otra cosa que haya utilizado (especialmente JDOM, que encuentro que tiene una API especialmente pobre). dom4j también permite conectar Jaxen para soporte XPath.
Ejemplos:
SAXReader reader = new SAXReader(); // dom4j SAXReader
Document document = reader.read(xmlInputStream); // dom4j Document
// select all link nodes with href "http://example.com"
List<Element> linkNodes = document.selectNodes("//link[@href='http://example.com']");
// select an attribute value
String val = linkNodes.get(0).attributeValue("href");
// select element text and trim it
String value = document.elementTextTrim("childNode");
he tenido suerte con JAXB. Está incluido en Java SE 6.
JAXB es una solución de enlace OXM, no un analizador XML general. Utiliza un analizador XML, pero no es uno en sí mismo. – duffymo
Sí, pero la pregunta no era sobre el analizador XML general. Fue "¿Cuál es la mejor clase en Java para trabajar con documentos XML?". Y JAXB definitivamente es una de las alternativas. –
Prefiero usar una combinación clásica de DOM y SAX.
Tiene que decidir entre dos enfoques diferentes para procesar XML: Hay DOM y SAX, ambos con ventajas y desventajas. Todo depende de tus necesidades y del tamaño del documento XML que quieras procesar. El ya mencionado JAXB construye una API sobre ambos y se envía con Java 6.
Cuando entendió lo anterior, es posible que desee formular su pregunta y tal vez solicitar el mejor DOM o la mejor implementación de SAX. Además de esto, sería bueno si pudieras decir cuáles son tus requisitos. ¿Quieres escribir o leer XML? ¿Qué tan grande serán los archivos? Y así.
EDIT:
Como Nat señalado, también hay StAX como un tercer concepto alternativo.
También hay StAX, que es de bajo nivel como SAX, pero permite que el código del cliente extraiga los eventos XML de una secuencia en lugar de manejar los eventos que se le envían desde el analizador. Esto hace que sea más fácil escribir analizadores de descenso recursivos para procesar contenido XML. – Nat
@Nat: ¡Nunca lo usé, gracias por la sugerencia! Acabo de editar mi respuesta e incluí un enlace. –
Si solo estás leyendo, entonces XPath es una buena apuesta. De lo contrario, el DOM (en el paquete org.w3c.dom
) es su mejor opción.
"mejor" no se define como el más fácil de entender y codificar, entonces. Y veo interfaces en org.w3c.dom, por lo que todavía necesita una implementación de algún tipo. – duffymo
Java tiene un buen soporte para XML. El problema en un sentido es que hay tantas opciones. Por lo tanto, no hay una sola solución que sea "la" forma de manejar XML en Java. Tienes que elegir tus herramientas según el problema en cuestión.
Supongamos que tiene documentos validados complejos que desea cargar en un árbol de objetos que luego puede consultar y manipular el árbol. Querrá un analizador DOM para esto, y hay un número para elegir. Esto convierte el documento completo en objetos, lo que puede ser costoso en términos de CPU.
Supongamos que tiene un documento donde desea seleccionar ciertos elementos, y el rendimiento es un problema. Pruebe con un analizador SAX, un analizador de extracción o XPath.
Quizás necesite alinear/separar los objetos en el cable. JAXB es un candidato para esto, al igual que otras opciones.
Por lo tanto, no hay una respuesta correcta para su pregunta. Al igual que con cualquier problema [de programación], debe analizar el problema, evaluar las opciones y elegir la mejor herramienta para el trabajo.
Cuando necesitaba trabajar con documentos XML siempre pensé en dom4j/sax como primer recurso, y nunca me decepciona. ;)
Debería consultar el SAXReader.
@Epaga, si no pone "lo mejor" en contexto, fallará miserablemente.
Por ejemplo, intentar cargar un enorme XML en una estructura tipo DOM sería muy estúpido. Debe seleccionar la herramienta sabiamente.
XOM (http://www.xom.nu) XOM (http://www.xom.nu) es un conjunto de herramientas XML simple y flexible que he encontrado más simple y más fácil de usar que muchos otros analizadores. Desde el cambio de las herramientas estándar basadas en W3C, mi productividad ha aumentado considerablemente. En sus páginas web, el autor Elliotte Rusty Harold explica por qué el diseño de XOM es el modelo apropiado para un XML DOM.
- 1. Mejor manera de manejo de archivos XML viñeta •
- 2. XStream manejo doble subrayado (Java)
- 3. Manejo de RuntimeExceptions en Java
- 4. Una mejor manera de hacerlo XML en Java
- 5. Java: manejo de excepciones en hilos secundarios
- 6. Generar esquema XML de la clase Java (o lo contrario)
- 7. Mejor editor WSDL/XML de código abierto para Java
- 8. Mejor PropertyChanged y PropertyChanging manejo de eventos
- 9. Manejo de LSB/MSB en Java
- 10. mejor analizador de Xml de Java para manipular/editar un documento xml existente
- 11. Manejo de elementos anidados en JAXB
- 12. Manejo de propiedades en Scala
- 13. Mejor práctica de clase
- 14. Mejor visualización XML en Firefox
- 15. Java - Codificación de imágenes en XML
- 16. Manejo de excepciones Java dentro de "eventos"
- 17. Manejo de listas de cadenas grandes en java
- 18. Mejor manejo de la clave faltante/incorrecta en boost :: program_options
- 19. Mejor manejo de Thread Context ClassLoader en OSGi
- 20. Cómo generar XML (en representación de cadena) en java
- 21. clase DataSet en Java?
- 22. Conversiones de Java a XML?
- 23. Manejo de alertas en Selenium WebDriver (selenio 2) con Java
- 24. análisis XML con XPath en Java
- 25. Manejo de excepciones en una aplicación web Java
- 26. Manejo de valores de sustitución Unicode en cadenas de Java
- 27. ¿Cómo cargar fácilmente un archivo de configuración basado en XML en una clase de Java?
- 28. ¿Cómo manejo mejor las matrices multidimensionales dinámicas en C/C++?
- 29. Ordenando un XML en Java
- 30. Manejo del carácter TAB en Java
Es extraño que la mayoría de los frameworks de Java dependan en gran medida de XML, pero Java, el lenguaje, tiene un soporte XML tan pobre en comparación con Python, por ejemplo. –
Defina "mejor". – Bombe
Tenga en cuenta que el lenguaje de programación se llama "Java", y no es un acrónimo, por lo que no debe escribirse con letras mayúsculas "JAVA". – Jesper