2009-04-10 16 views
38

Me preguntaba cuáles son las api mejores o más utilizadas para convertir un objeto java en xml. Soy bastante nuevo en el tema. ¿Hay algún tipo de llamada api que puedas hacer para pasar un objeto y devolver xml? ¿O es mucho más tedioso cuando se necesita construir el documento manualmente extrayendo los valores de los objetos?¿Cuál es la mejor manera de convertir un objeto java en xml con apis de código abierto

He estado leyendo acerca de xerces, sax y jaxb. Me gustaría continuar a lo largo de esta ruta de código abierto.

Gracias!

Respuesta

53

JAXB es sin duda la solución .

¿Por qué? Bueno, es dentro del JDK 6, por lo que nunca lo encontrará sin mantenimiento.

Utiliza anotaciones Java para declarar propiedades relacionadas con XML para clases, métodos y campos.

Tutorial 1

Tutorial 2

Nota: JAXB también le permite fácilmente 'unmarshal' datos XML (que fue marshalled previamente de instancias de objetos Java) de nuevo a instancias de objeto.

Uno más bueno de JAXB es: Es apoyado por otros tecnologías relacionadas con Java, como JAX-RS (una API REST de Java, que es dotados como parte de Java EE 6). JAX-RS puede servir y recibir JAXB objetos sobre la marcha, sin la necesidad de ordenar/desasignarlos. Es posible que desee comprobar Netbeans, que contiene soporte listo para usar para JAX-RS. Lea this tutorial para comenzar.

edición:

A (o extranjeros) objetos Java Marshall/Resolver referencia 'al azar', JAXB ofrece posibilidad bastante simple: Uno puede declarar un XmlAdapter y 'wrap' clases Java existentes para ser Compatible con JAXB. El uso de dicho XmlAdapter se realiza utilizando el @XmlJavaTypeAdapter -annotación.

+1

Este paquete parece orientado en la asignación de un archivo XML existente a código Java, en lugar de persistencia rápida y sucia de objetos java "aleatorios". ... que es algo útil que hacer, pero no exactamente lo que se me pidió, creo. – Roboprog

+0

Consulte la sección de edición de mi respuesta –

+1

JAXB es para encuadernación, no para serialización. Use java.beans.XMLEncoder para la serialización simple. – erickson

18

Es posible que desee ver en xstream: http://x-stream.github.io

+1

He usado esto para escribir/leer objetos como XML. Funciona, y no es difícil. – Roboprog

+2

Salida: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

+1

@BlaiseDoughan excelente artículo. – James

1

XMLBeans es otro, similar a JAXB. No he mirado JAXB desde hace un tiempo, cuando lo hice fue bastante malo en comparación con XMLBeans, pero eso fue hace años (y prefiero usar cosas que están en el JDK en comparación con las de terceros, pero todavía uso XMLBeans hasta el día de hoy).

1

Hay muchos marcos de código abierto en este espacio. Sin embargo, Simple como su nombre lo indica, es de lejos la forma más fácil de realizar la serialización. Eche un vistazo al Tutorial. Otra característica es que puede realizar serialización polimórfica, lo que significa que no está tan limitado como JAXB, por ejemplo.

4

disponible con Java 6 es una API para convertir objetos Java con anotaciones a XML. El código siguiente muestra cómo convertir un objeto anotadas, en una cadena XML

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type()); 

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller(); 

// Do this if you want the result to be more human readable. 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
m.marshal(o, System.out);

Se puede extender aún más esta añadiendo la validación del esquema (nota muy lento, pero útil para la depuración)

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type()); 

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller(); 
final Schema schema = SchemaFactory.newInstance(
    "http://www.w3.org/2001/XMLSchema").newSchema(
    getClass().getResource("/META-INF/wsdl/schema.xsd")); 
m.setSchema(schema); 
m.marshal(o, System.out);

Usted don' Necesito hacer una conversión de tipo a JAXBElement si Type es un elemento definido. (Es decir, tiene una anotación @XmlRootElement)

3

Para cualquier persona que decide utilizar JAXB, por favor asegúrese de almacenar en caché JAXBContext. Se sabe que JAXBContext.newInstance es muy caro. Documenté un caso en el que la conversión a xml se usa en el registro y JAXBContext.newInstance no se almacena en caché, ocasionó una sobrecarga de rendimiento de hasta 5 segundos cuando fue invocado por 20 usuarios simultáneos.

http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html

Esto no es para desanimar a nadie usando JAXB. Una vez que JAXBContext se almacena en caché, el rendimiento es excelente, como se explica en el enlace anterior.

Cuestiones relacionadas