2008-10-15 21 views
19

¿Qué está utilizando para vincular XML a Java? JAXB, Castor y XMLBeans son algunas de las opciones disponibles. Las comparaciones que he visto tienen tres o cuatro años. Estoy abierto a otras sugerencias. El rendimiento de marshalling/unmarshalling y la facilidad de uso son de particular interés.Java XML Binding

Aclaración: Me gustaría ver no solo qué marco utiliza, sino su razonamiento para usar uno sobre los demás.

Respuesta

8

JiBX. Previamente utilicé Castor XML, pero JiBX demostró ser significativamente mejor, particularmente en términos de rendimiento (un puerto directo de algún código de aplicación de Castor XML a JiBX lo hizo 9 veces más rápido). También encontré que el formato de mapeo para JiBX es más elegante que el de Castor.

JiBX logra su rendimiento mediante el uso de la codificación de códigos de bytes posterior a la compilación en lugar del enfoque de reflexión adoptado por Castor. Esto tiene la ventaja de que impone menos exigencias en la forma en que escribes tus clases mapeadas. No hay necesidad de getters, setters y constructores no-arg solo para satisfacer las herramientas. La mayoría de las veces puede escribir la clase sin considerar los problemas de mapeo y luego mapearla sin modificaciones.

+0

+1 para JiBX. La gran ventaja que veo es la forma en que parece que se usa JiBX. Aunque la generación de código es una opción, parece haber mucho énfasis en escribir sus propias asignaciones para su propio modelo de datos. Cualquier cosa que me impida tratar con las clases generadas me hace feliz. Usé JiBX durante unos años y me encantó. No puedo decir lo mismo de Castor. :) – spaaarky21

0

Utilizamos Castor. Se adapta bastante bien a nuestras necesidades.

3

Usamos xstream. La clasificación/desemparejamiento es trivial. Vea sus tutorial para ejemplos.

+0

Guau, ¡eso se ve bastante resbaladizo! –

+0

Xstream es una tecnología de serialización xml, no una tecnología vinculante. – johnstok

+0

Sí, la diferencia entre la serialización y el enlace es importante. – erickson

2

Jibx es lo que se utiliza aquí. Es muy rápido, pero las ataduras pueden ser un poco complicadas. Sin embargo, es especialmente útil si tiene esquemas XML que describen sus objetos de dominio, ya que realmente se corresponde bien con XSD (incluso hay una herramienta beta XSD2Jibx que puede tomar XSD y crear clases y asignaciones de dominio stub, que luego puede tomar y convencer a adaptarse a su modelo de dominio existente).

Manipula bytecode, por lo que debe ejecutarse después de la compilación inicial de los archivos .class de Java. Puede usar el plugin Maven para ello, o simplemente usarlo directamente (el plugin Eclipse no pareció funcionar para mí).

2

He usado Jaxb con éxito variable. En ese momento (un par de años atrás) la documentación general era mediocre y la documentación básica de uso (incluyendo dónde descargar implementaciones) era difícil de encontrar o variada.

El analizador que escribió las clases de Java era bastante bueno con poca discrepancia con el XSD original (aunque creo que tenía problemas para soportar elementos abstractos XML).

No lo he usado desde entonces, pero tengo un próximo proyecto que requerirá solo un marco así y me interesará saber cómo alguien más realiza la ferias con lo anterior.

+0

Parece tener una serie de buenos enlaces aquí: http: // stackoverflow.com/questions/35785/xml-serialization-in-java –

+0

Echa un vistazo a mi blog para ver ejemplos de JAXB: http://bdoughan.blogspot.com –

1

He usado castor hace 7 años - funcionó bastante bien. usados ​​DTDs. No hay muchas opciones en ese momento.

En los proyectos actuales, he usado
1) JAXB - basado en estándares, Implementación de referencia disponible, línea de comando y herramientas disponibles. última versión - 2.1.8 necesita Java 5+.
2) XStream: para unificar el jabón, necesita Java 5+. No es tan rápido y cumple con los estándares como JAXB más reciente.

BR,
~ Un

12

Si desea tomar una decisión informada, debe tener claro por qué está traduciendo entre objetos XML y Java.La razón es que las diferentes tecnologías en este espacio intentan resolver diferentes problemas. Las diferentes herramientas se dividen en dos categorías:

  1. Enlace de datos XML: se refiere al proceso de representación de la información en un documento XML como un objeto en la memoria de la computadora. Típicamente, esto significa definir un XSD y generar un código fuente Java equivalente. La interoperabilidad entre diferentes idiomas es la principal prioridad (de ahí el uso de XSD), más típicamente para la implementación de servicios web basados ​​en SOAP.
  2. serialización XML: se refiere a escribir un gráfico de objetos de memoria en una secuencia, para que pueda reconstituirse en algún lugar o en cualquier otro momento. Usted escribe las clases de Java a mano; la representación xml es de importancia secundaria. Además, la necesidad de rendimiento suele ser mayor y la necesidad de interoperación con otros lenguajes como .net suele ser menor.

Para la serialización xml, Xstream es difícil de superar. JAXB es el estándar para el enlace XML.

En cualquier caso, si está utilizando J2EE deberá prestar especial atención a las clases recuperadas de JPA, ya que los tipos de clase y los tipos de recopilación específicos de persistencia pueden confundir las herramientas de enlace/serialización.

+0

Gracias por su aporte. Estoy buscando una solución vinculante. Esto es para un servicio web RESTful con un XSD existente. Hemos estado usando Castor por varios años. Me gustaría saber las razones por las cuales JAXB (o lo que sea) es mejor/peor. –

+0

Si está familiarizado con XStream al menos, ¿le importaría revisar mi pregunta sobre XMLDecoder versus XStream? http://stackoverflow.com/questions/96059/what-are-the-relative-advantages-of-xmlencoder-and-xstream – erickson

4

Si tiene un XSD para el XML, y no necesita vincular los datos a un conjunto existente de clases, me gusta mucho XMLBeans. Básicamente, funciona así:

  • Compilar XSD
  • uso genera clases Java para leer/documentos de escritura conforme a este esquema

Enlazar un documento XML con las clases generadas es tan simple como:

EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile); 
1

XmlBeans es una buena opción, especialmente si ha 'roto' archivos XSD/WSDL.

Don mencionó

EmployeesDocument empDoc = EmployeesDocument.Factory.parse (xmlFile);

..pero también puede tomar un Nodo, un Archivo o cualquier fuente.

No pelea con espacios de nombres, atraviesa el objeto que desea unmarshall, y Factory.parse él.

Desearía haberlo encontrado hace 2 semanas.