2010-01-11 8 views
5

Necesito generar una cantidad de documentos XML a partir de objetos Java. Los objetos son objetos mapeados ORM profundos, y los documentos XML son para un índice de búsqueda (a la Lucene). Quiero poder crear un archivo de configuración y darle un objeto Java y escupir el XML especificado en la configuración. Idealmente, la configuración consistiría en un mapeo de propiedades (posiblemente profundas) en el lado de java para XPath o algo muy parecido en el lado de XML.¿Qué es una buena biblioteca para generar XML arbitrario desde Java?

JAXB no es adecuado porque quiere crear un mapeo uno a uno desde los datos del objeto a los nodos XML. Miré a JIBX y XStream, pero ninguno de ellos parece estar diseñado para hacer lo que estoy diciendo.

Esencialmente lo que quiero es Dozer, pero diseñado para crear un documento XML como su objetivo en lugar de otro Java Bean. De mi investigación hasta el momento parece que voy a tener que escribir esto yo mismo. ¿Alguien puede ofrecer una mejor alternativa?

EDITAR: La solución no debe basarse en la capacidad de modificar los archivos Java de origen. Los sistemas basados ​​en anotaciones son totalmente inútiles para mis propósitos aquí. Debería ser posible definir 'traductores' para las asignaciones individuales tal como está en Dozer.

Se debe tener en cuenta que necesito poder especificar que un campo de entrada dado en java pueda mostrarse en varios lugares diferentes en la salida XML, tal vez se pueda transformar en algunos casos y no en otros.

Ya he considerado hacer algún tipo de traducción directa de Java a XML de los objetos y luego realizar mi tarea usando XSLT, pero el problema es que se trata de objetos profundos con conexiones bidireccionales. Cualquier mapeo de los objetos a XML tendría dificultades para determinar qué tan profundo en la jerarquía de objetos para ir, incluso si pudiera realizar un seguimiento de los objetos que deben descontarse porque ya se habían visto.

+0

JiBX debe ser bueno para esto, ¿por qué no le gusta? – skaffman

Respuesta

4

utilizo este: Simple

+0

Esto parece estar completamente basado en anotaciones. Quiero ser capaz de lograr mi objetivo estrictamente a través de un archivo de configuración y, potencialmente, un conjunto de objetos traductores para formatear correctamente algunos datos. Además, no veo ninguna forma de especificar una sola propiedad de entrada para múltiples campos de salida. – Jherico

+0

upvoted, ya que esto respondió la pregunta original. –

+0

No tanto. Pensé que había dejado bastante claro que * quería * un archivo de configuración. – Jherico

1

¿Has mirado en Castor?

En particular, esta cita de su página web me hace pensar que podría hacer lo que quiera:

Aunque es posible confiar en el comportamiento por defecto de Castor para reunir y objetos unmarshal Java en un documento XML , podría ser necesario tener más control sobre este comportamiento. Por ejemplo, si ya existe un modelo de objeto Java, Castor XML Mapping se puede usar como un puente entre el documento XML y ese modelo de objetos Java.

Castor le permite a uno especificar algo de su comportamiento de clasificación/no clasificación mediante un archivo de mapeo. Este archivo proporciona información explícita a Castor sobre cómo un documento XML dado y un conjunto determinado de objetos Java se relacionan entre sí.

Otra posibilidad podría ser JXM; desde su página web:

Java XML Mapping (JXM) es una herramienta para escribir objetos Java en XML y leerlos de nuevo. JXM proporciona una asignación predeterminada para que los objetos de Java que siguen las convenciones de nomenclatura de Java Bean se puedan escribir en XML llamando a un único método. La asignación predeterminada se puede personalizar creando y registrando clases de asignación con el marco JXM.

JXM difiere de otras herramientas de enlace XML al no requerir que los objetos se incluyan o hereden del código JXM. No se incluye código generado en los objetos, y no es necesario implementar interfaces JXM. La personalización se hace escribiendo código Java en lugar de descriptores XML.

+0

Castor parece ser lo más cercano a lo que estoy buscando de todo lo que he visto. Sin embargo, su configuración centrada en la clase me hace preguntarme si permite múltiples asignaciones del mismo campo de entrada a múltiples salidas. Tampoco veo ningún ejemplo de mapeo de campos profundos. Voy a investigar más a fondo. – Jherico

0

Eche un vistazo a Xmappr.

Se puede configurar a través de XML externo. Puede tener varias asignaciones que producen diferentes salidas del mismo objeto de entrada.

También estamos dispuestos a ayudar, solo pregunte en la lista de correo.

0

Hemos utilizado Apache Velocity en el pasado como un medio para mantenerlo simple.

Simplemente cree una plantilla para el XML, llene una estructura de datos e inserte la estructura de datos en el mapa. Le permite cambiar el XML en tiempo de ejecución si es necesario (siempre que su estructura de datos tenga todos los campos).

Esta es una manera muy rápida y flexible de producir un documento, no crea un DOM y por lo tanto es bastante parecida a la memoria.

+0

La desventaja es que si arruinas las plantillas puedes terminar generando XML inválido/incorrecto en algunas circunstancias. –

+0

Totalmente de acuerdo. Esto no es difícil de arreglar sin embargo. Puede agregar una fase de validación por separado si lo desea. – Fortyrunner

0

La solución que desea es EclipseLink MOXy:

moxy es una aplicación JAXB con extensiones

moxy tiene un archivo de configuración externa (basada en anotaciones JAXB con extensiones):

Tiene mapeo basado XPath, para el mapeo de profundidad:

Diseñado para manejar ORM mapea objetos, incluyendo el apoyo a las relaciones bidireccionales:

0

usted no especifica qué se utiliza ORM, pero si por casualidad es de hibernación, se puede utilizar para hacer Java < -> asignación XML también. La documentación no es tan buena como para las asignaciones de DB, pero no es tan difícil de usar. La gran ventaja: tiene una dependencia menos, un marco de trabajo menos para aprender y los conceptos que tiene que aprender para el mapeo de DB se aplican principalmente al mapeo XML.

ver: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/xml.html

Cuestiones relacionadas