2010-11-20 25 views
27

¿Cuáles son los diferentes enfoques para convertir Java Objects en XML, sé que una opción es JAXB pero me gustaría saber cuáles son las otras approaches/tools disponibles para la misma?Conversiones de Java a XML?

Nota: no tengo más requisitos y así que no puedo añadir más meat a la pregunta, pero en este punto del tiempo que sería muy grande si puedo tener una idea de lo que los diferentes enfoques están disponibles para convirtiendo Java to XML?

Actualización: Diferentes enfoques sugeridos son:

  1. javax.xml.bind.Marshaller y javax.xml.bind.Unmarshaller
  2. XStream
  3. XMLBean
  4. JAXB
  5. Castor
  6. JIBX
  7. Apache Digester

Ahora entre todos los enfoques sugeridos ¿cuál es la mejor enfoque para ir convertir Java Objects to XML y XML to Java Objects?

+0

Utilicé XStream en el pasado. Fue relativamente poco doloroso y flexible, pero la flexibilidad proviene de la capacidad de ampliar/agregar diferentes visitantes en el código en sí contra algunos funky XML/XSD o DSL. –

+0

Entonces, ¿cómo se compara 'XStream' con' JAXB'? – Rachel

+0

Aquí está mi comparación de JAXB y XStream: http://bdoughan.blogspot.com/2010 /10/how-does-jaxb-compare-to-xstream.html como ya he admitido, conduzco una implementación JAXB pero creo que la comparación es justa. Hice una comparación similar entre JAXB y Simple XML, y Simple XML sitio lo enumera en su sección de artículos. –

Respuesta

30

JAXB es el estándar y el mejor enfoque para la conversión de objetos Java a XML.Hay varias implementaciones de código abierto disponibles:

Para obtener más información sobre JAXB echa un vistazo a mi blog:

ACTUALIZACIÓN:

¿Cuál es el mejor enfoque?

Esto depende en última instancia de lo que está tratando de hacer, voy a explicar a continuación:

Uso Caso # 1 - A partir de un esquema XML

En este caso de uso tiene un XML esquema y desea generar un modelo de Java. No muchas de las herramientas mencionadas en este hilo apoyan este caso de uso. XStream for example recommends XMLBeans for this.

Nominados:

  • JAXB (todas las implementaciones) - Genera POJOs con anotaciones JAXB.
  • XMLBeans - Genera clases propietarias que incluyen lógica de enlace XML.

Caso de uso # 2 - A partir de clases de Java (que se puede editar)

En este caso de uso que tiene mucho más la selección (sólo XMLBeans se elimina). Las ediciones normalmente implican la adición de anotaciones para controlar el mapeo.

Nominados:

  • todos, pero XMLBeans

Caso de uso # 3 - Inicio de Clases forma de Java (que no se puede editar)

En este caso de uso no hacer tener la fuente para modificar las clases de modelo. Esto requiere que los metadatos se suministren externamente con un archivo XML de por código.

Nominados:

  • EclipseLink JAXB (moxy) - Ofrece una external binding file, y los metadatos se pueden aplicar mediante programación.
  • metro JAXB - Puede aprovechar Annox o JAXBIntroductions
  • Castor - Ofrece un archivo de unión externa
  • JiBX - Ofrece un archivo de unión externa
  • xstream - Los metadatos se pueden aplicar mediante programación

Caso de Uso # 4 - Meet-in-the-Middle (Esquemas y clases existentes)

En este caso de uso tiene clases que necesita para m ap a un esquema XML existente. EclipseLink moxy con su XPath based mapping es la única herramienta que soy consciente de que puede manejar este caso de uso

Nominados:

  • EclipseLink JAXB (moxy)

Caso de uso # 5 - XML Infoset Preservation:

En este caso de uso, necesita conservar el contenido no asignado: comentarios, instrucciones de procesamiento, etc.

Nominados:

  • JAXB (todas las implementaciones) - tiene la característica Binder.
  • XMLBeans: el modelo de objetos generado almacena todo el infoset XML.

Caso de uso # 6 - Compatibilidad con JPA

APP es el estándar de Java para la persistencia de Java. JPA tiene muchos conceptos: claves compuestas, relaciones bidireccionales, carga diferida, etc. que pueden ser difíciles de usar con una solución de enlace XML. Por ejemplo, cualquier herramienta XML que solo interactúa con objetos a través del campo generalmente tendrá problemas con las propiedades de carga diferida.

Nominados:

Caso de uso # 7 - Compatibilidad con los Servicios Web XML (JAX-WS)

JAXB es la capa de enlace predeterminada para JAX-WS.

Nominados:

  • JAXB (aplicación depende del proveedor de JAX-WS)

Caso de uso # 8 - Compatibilidad con los Servicios Web REST (JAX-RS)

JAX-RS ofrece una alternativa ligera a JAX-WS basada en el protocolo HTTP.Consulte lo siguiente para obtener un example.

Nominados:

  • JAXB (todas las implementaciones) - La capa de enlace por defecto y más fácil de usar con JAX-RS.
  • Todo lo demás: puede aprovechar los conceptos de MessageBodyReader/Writer para usar otras herramientas XML.

Caso de uso # 9 - Compatibilidad con la primavera

primavera ha algunas de ellas construidas en apoyo para la integración con herramientas de unión XML, revisa el siguiente enlace para más información:

Nominados:

  • JAXB (todas las implementaciones)
  • Castor
  • XMLBeans
  • JiBX

otras cosas a considerar

  • es la herramienta aún en desarrollo/compatibles? Por divertido que parezca, he visto personas que recomiendan herramientas que no han sido actualizadas en 5 años. Algunas de las herramientas mencionadas aquí no se han lanzado en 2 años.

My Pick for BEST approach? - JAXB

Mirando las categorías anteriores, JAXB puede no ser siempre el más adecuado para un caso de uso particular (pero siempre es una buena opción), pero es la única biblioteca que se puede usar para todo el uso casos. Esto significa que siempre puede hacer el trabajo. La alternativa es usar diferentes bibliotecas para diferentes tareas que le brindan múltiples bibliotecas para admitir.

Dirijo una implementación de JAXB EclipseLink MOXy, pero MOXy comenzó su vida como una biblioteca propietaria de enlace XML TopLink OXM. TopLink siempre ha entendido el beneficio de los estándares (es decir, EJB/JPA), e implementamos JAXB 1. Luego, nosotros (soy el represetativo) pasamos a ser miembros activos en JAXB 2 (JSR-222).

+3

Blaise es un líder del equipo JAXB, por lo que tal vez no sea la opinión más objetiva. – duffymo

+0

Sí lo hace. Su voto a la baja no estaba justificado. Y ser un líder JAXB ciertamente te convierte en una autoridad en tu tecnología, pero no es la única alternativa que existe. XStream sería igual de válido. Personalmente, me gusta mucho mejor que el tuyo. – duffymo

+0

Esa es su opinión, y tiene derecho a ella. El OP pidió otros enfoques, y yo di uno. – duffymo

10

Siempre puede hacerlo usted mismo con las interfaces javax.xml.bind.Marshaller y javax.xml.bind.Unmarshaller.

Esto no es tan loco como parece. No es tan difícil de hacer, y tendrás control total y conocimiento de lo que se hace.

Estoy dispuesto a reconocer que muchas personas prefieren un enfoque automatizado. Mi oferta no será popular.

He usado XStream en el pasado y me ha gustado, pero cuando lo he usado no tenía que preocuparme por los espacios de nombres XML. Me dijeron que XStream no los trata bien.

+1

Menos dependencias, más control. Algunas bibliotecas que serializan Java a XML y viceversa no hacen cosas buenas. Mira cómo manejan las colecciones en algún momento y ve lo que quiero decir. Las implementaciones de Marshaller y Unmarshaller no son tan difíciles de escribir si tiene clases simples que no están profundamente anidadas, y solo tiene que hacerlo una vez. Debo señalar que usted figura como un líder del equipo de JAXB, por lo que tal vez se muestre su parcialidad, Blaise. – duffymo

+2

+1 para contrarrestar el downvote sin sentido. –

+0

Gracias, Stephen C. – duffymo

2

Algunas alternativas incluyen: -

Sin embargo, una ventaja significativa de ir con JAXB es que se suministra con el distrubtion Java.

+0

Eche un vistazo a mi comparación de JAXB y XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

0

También son:

  • java.beans.XMLEncoder/-Decoder
  • javax.xml.stream.XMLStreamWriter

pero recomiendo utilizar JAXB si no tiene una buena razón para no hacerlo.

1

Sé que esto no es lo que ha preguntado, pero ¿ha considerado JSON en lugar de XML? Actualmente estoy trabajando en un proyecto que hace un uso intensivo de JSON (con la biblioteca Jackson) y estoy muy contento con él. Jackson funciona de manera similar a JAXB, incluso funciona con anotaciones JAXB, en caso de que quiera usar ambas.

XMLBeans también vale la pena mirar.

+0

+1 para Jackson - Me gusta mucho. Acabo de empezar a usarlo recientemente. – duffymo

+0

Jackson es solo para JSON y no para XML, ¿es correcto? – Rachel

+0

Derecha, Jackson traduce Java a JSON y viceversa. No responde a la pregunta per se, pero pone la alternativa de usar JSON en la mesa. Serán muchos menos bytes que XML. – duffymo

0

Apache Digester es una opción. Aquí hay un tutorial.Si el formato JSON es aceptable, entonces puede usar google-gson.

+0

¿Será útil Apache Digester para convertir Java a XML? ¿Estaba revisando el documento y parece que se usa para XML a Java? Es eso correcto ? – Rachel

+0

@Rachel: Sí, se usa para convertir objetos Java a xml. – Emil

+0

Estaba repasando los comentarios sobre Apache Digester y parece que no es el mejor enfoque, ¿es cierto o tiene alguna experiencia diferente al usarlo? – Rachel

1

simple serialización XML (simpleframework.org)

Otro enfoque es Simple su mucho más fácil de usar que JAXB, JiBX u otro tipo de herramientas. Simplemente anota la clase y puedes serializar cualquier POJO a XML. Además, es probablemente el único marco que actualmente funciona en todas las plataformas Java conocidas, incluyendo Android, Google App Engine, cualquier JDK 1.5+. Para obtener más información, puede consultar el Tutorial

+0

Con JAXB simplemente anota tus clases para serializar cualquier POJO a XML. La cantidad de trabajo es similar, ver: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-simple.html. JAXB también es mucho más fácil de usar con marcos de servicios web estándar como JAX-WS (SOAP) y JAX-RS (REST). –

+0

Es un trabajo de 5 minutos para integrar con JAX-RS, dudo que JAXB sea más fácil de usar aquí. También características como inyección de constructor, plantillas y muchas más parecen estar ausentes en JAXB, como lo es el soporte para Android. –

0

Castor permite la generación de clases de Java (implementaciones decentes) directamente desde el esquema XSD (caso de uso n. ° 1 anterior). Solo asegúrese, en Android 2.1, de no utilizar el SAXParser predeterminado de Android. Obtendrás errores de espacio de nombres. Para ello, defina el analizador como, por ejemplo, Xerces (y agregue los JARS necesarios) en core.properties. En Android 2.2, puede estar bien. Tenga en cuenta que si crea un xmlcontext para el unmarsheler con xerces, aún no funcionará, ya que el mapeo mismo se analizará con el SAX de Android. Debe hacerse en el núcleo (archivo de propiedades de nivel superior) para que incluso la asignación sea analizada por xerces. finalmente - el rendimiento es tan lento como se puede esperar ... :(Buena suerte SM