2010-06-30 24 views
12

Me pregunto si es posible tener JAXB para no crear objetos Java para elementos XML que sirven como envoltorios. Por ejemplo, para XML con la siguiente estructuraManejo de elementos anidados en JAXB

<root> 
    <wrapper> 
     <entity/> 
    </wrapper> 
</root> 

no quiero un objeto para <wrapper> que ser creado en absoluto. Así que para una clase como

class Root { 
    private Entity entity; 
} 

el elemento <entity> debe unmarshalled directamente en el campo entidad.

¿Se puede lograr con JAXB?

+0

En su ejemplo, '' no va a generarse en absoluto. Por favor, publique un código de ejemplo que reproduzca el problema. – skaffman

+0

Permítanme reformularlo: ¿cómo hago una anotación en la clase proporcionada para que el XML de la estructura descrita pueda destrabarse? – fnt

+0

Eso no es mucho mejor. Todavía no está claro lo que estás tratando de hacer. Necesitamos un ejemplo. – skaffman

Respuesta

6

pesar de que requiere codificación adicional, unmarshalling deseada se puede hacer de esta manera de acuerdo al objeto envoltorio transitoria:

@XmlRootElement(name = "root") 
public class Root { 

    private Entity entity; 

    static class Entity { 

    } 

    static class EntityWrapper { 
     @XmlElement(name = "entity") 
     private Entity entity; 

     public Entity getEntity() { 
      return entity; 
     } 
    } 

    @XmlElement(name = "wrapper") 
    private void setEntity(EntityWrapper entityWrapper) { 
     entity = entityWrapper.getEntity(); 
    } 

} 
+0

Parece correcto, pero creo que se reduce a simplemente desenvolver el objeto, es decir, asignar propiedades N del envoltorio al nuevo objeto Root. Una pequeña solución engorrosa ... –

+1

@ MichałZiobro Usted es libre de proporcionar su propia solución, que no es engorroso – fnt

-2

El objetivo de JAXB u otros sistemas de mapeo es asignar los elementos y su jerarquía a las clases. En su ejemplo, parece querer que JAXB de alguna manera sepa que puede ordenar la entidad en envoltorio/entidad y viceversa sin realmente crear la clase utilizada para la asignación de contenedor y la conexión entre la raíz y la entidad. Cuál, según lo presentado, es más o menos equivalente a preguntar cómo conectar el motor de un automóvil a las ruedas sin un árbol de transmisión.

Por lo tanto, a menos que me esté faltando el punto, la respuesta es no, ni JAXB ni ningún otro programa de mapeo puede hacer esto. Puede evitar la creación de clases utilizando algo que hace una asignación puramente dinámica (consulte Groovy, GPath para ver un ejemplo), pero eso evita crear todas las clases, no solo omitir un nivel intermedio en una jerarquía.

+2

Según lo explicado por Doug Clarke, esto se puede hacer usando EclipseLink MOXy. –

+0

Esta respuesta es tan engañosa. Es absolutamente posible realizar el desemparejamiento requerido - http://stackoverflow.com/a/3155877/318054 – fnt

5

EclipseLink MOXy ofrece una aplicación JAXB 2.2 con extensiones. Una de las capacidades extendidas es usar XPath para navegar a través de las capas del XML que no desea en su modelo de dominio.

Si nos fijamos en:

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions

se dará cuenta de que el nombre del cliente se almacena dentro pero que el nombre es un atributo de cadena de cliente. Esto se logra usando:

@XmlPath("personal-info/name/text()") 
public String getName() { 
    return name; 
} 

espero que esto ayude,

Doug

+0

Gracias por mencionar esto. Estaba pensando en usar XPath de alguna manera, es bueno saber que hay una implementación lista para usar. – fnt

+3

La flexibilidad de mapeo adicional de EclipseLink es excelente. También me gusta mucho lo que los desarrolladores han hecho al admitir enlaces XML en un archivo de mapeo externo en lugar de solo a través de anotaciones. Esto permite mapear un modelo de dominio a múltiples XSD, versiones, así como a diferentes fuentes de datos sin ningún tipo de desorden –

Cuestiones relacionadas