2010-07-18 16 views
22

¿Cuál es la mejor forma de convertir XML en objetos Java?Conversión de objetos XML a Java

No deseo un me gusta para una representación similar, pero me gustaría extraer ciertos datos del XML y llenar un objeto Java. Eché un vistazo a XStream, pero realmente no me gustó todo el tipo de cosas "mover hacia abajo, avanzar". Yo preferiría un DOM como objetivo al escribir convertidores ...

+0

Xstream se ve bien, lo único es que preferiría trabajar con la aplicación de JDOM HierarchicalStreamReader .... supongo que podría echarlo pero esto parece un poco extraño .... ¿Hay una forma de usar convertidores pero usando el lector JDOM? –

Respuesta

11

Sé que a todo el mundo le gustan las soluciones automáticas como JAXB y tal, pero recomendaría las implementaciones javax.xml.bind.Marshaller y javax.xml.bind.Unmarshaller para obtener exactamente lo que quiere sin llenar innecesariamente el espacio de su memoria perm. Utilice JDOM para analizar XML y mapear los valores en objetos Java utilizando XPath. Trabajará una vez para lograrlo, pero tendrá exactamente lo que necesita y nada más.

+0

¿Por qué mencionas PermGen? – Abdull

+3

¿Dónde crees que va el código de bytes de clase generado por JAXB? Podría ser discutible con JDK8: no más de perm gen. Escribí esta respuesta hace cinco años. – duffymo

2

No estoy del todo seguro de si esto es lo que busca, pero se puede usar algo así como XMLBeans para vincular XML a objetos Java. Tuve que usarlo en un empleador anterior. Desafortunadamente, era un sistema existente y solo tuve que manipular los objetos y no tuve que producir la biblioteca que los contiene. Además, no estoy seguro de qué tan bien funcionará sin un XSD (no mencionó si tenía uno o no).

3

Me gusta Simple y me ha resultado muy fácil trabajar con él. Sin embargo, produce una representación similar, por lo que tal vez no sea exactamente lo que está buscando.

Si está buscando una solución tipo DOM, quizás sea adecuado un JDom.

21

Si tiene un esquema XML, JAXB es bueno: viene como parte del JDK. Genere clases Java ejecutando, p. Ej. xjc -p foo myschema.xsd

para leer un archivo XML y volvamos un objeto (de clases generadas por la herramienta xjc):

JAXBContext context = JAXBContext.newInstance(FooObj.class); 
    Unmarshaller unMarshaller = context.createUnmarshaller(); 
    FooObj param = (FooObj) unMarshaller.unmarshal(new FileInputStream("Foo.xml")); 

Se pueden hacer cosas similares si solo deseas partes de un documento XML convertir en un objeto , por ejemplo, deberías poder darle a JAXB parte de un documento DOM, en lugar de un archivo completo como se hizo anteriormente.

+1

+1 - También puede usar implementaciones JAXB (JSR-222) cuando se inicia desde clases Java. Solo necesita agregar anotaciones donde desee que la representación XML difiera de la predeterminada: http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html –

3

Puede usar Castor para una conveniente conversión de XML a Java y viceversa.

Con Castor, puede

  1. conversión Facilidad: Un simple Marshaller y Unmarshaller hace conversión de XML para Java y volver extremadamente fácil.
  2. Asignación: se puede crear un archivo de asignación para restringir la cantidad de datos que se convertirán de XML a Java y viceversa.
+0

Los archivos de asignación de Castor son fáciles e intuitivos, sin embargo : * puede pasar el valor como parámetro constructor solo si es un atributo xml (no se admiten los elementos como parámetros del constructor) * no puede escribir directamente en los campos privados si tiene el dominio implementado en el enfoque DDD (no setters y constructores en su lugar) y la información de la tienda xml de entrada como elementos, no hay manera de usar castor –

5

JAXB es la mejor manera de convertir objetos a XML, y MOXy es la mejor implementación de JAXB.

  • JAXB is standard, incluido en Java SE 6
  • tecnología de unión XML estándar para JAX-WS, JAX-RS, y SCA
  • tiempo de ejecución simple

moxy ofrece las siguientes extensiones:

+0

Quiero ir en sentido contrario de XML a un objeto. También mi documento XML es muy grande y solo quiero analizar un pequeño subconjunto de los datos en mis objetos. –

+1

JAXB/MOXy también admite XML para un objeto. Solo necesita asignar el contenido que desea que se ignore todo lo demás. El mapeo basado en XPath de MOXy lo ayuda a mantener un pequeño modelo de objetos. Ver http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html –