2009-05-07 17 views
6

estoy analizar un documento XML que tiene nodos como las siguientes:JAXB para Resolver referencia elementos con distintos nombres/dinámicas

<objects> 
    <dog> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </dog> 
    <cat> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </cat> 
</objects> 

Los elementos de datos1, datos2, datos3 son siempre coherentes. Solo la etiqueta principal varía. En mi modelo de objetos, tengo un solo Objeto que representa todos estos casos. ¿Cómo puedo hacer que JAXB maneje este caso sin saber de antemano el nombre del elemento?

@XMLAnyElement coincide con todos los objetos pero no crea un objeto del tipo apropiado; Obtengo una lista de objetos Node en lugar de mi objeto. Mi objeto actualmente se ve algo como:

public class MyObject { 
    protected String otherData; 

    @XmlAnyElement 
    @XmlElementWrapper(name = "objects") 
    protected List<MyChildObject> childObjects; 
} 

public class MyChildObject { 
    protected String data1; 
    protected String data2; 
    protected String data3; 
} 

Alguna idea de cómo manejar este caso menos que cambiar el formato XML entrante para utilizar <object type="dog"> elementos?

Respuesta

6

Si el nombre es verdaderamente dinámico, entonces no creo que JAXB te ayude. Si tiene una cantidad definida de varios nombres de elementos, puede usar la herencia como la otra publicación sugerida. Si se desconoce el número de elementos y nombres Yo recomiendo usar algo como esto:

@XmlMixed 
@XmlAnyElement 
public List<Object> getObjects() { 
    return objects; 
} 

Esto haría que el elemento es un sólo un elemento DOM. Luego puede usar JAXB por segunda vez para pasar de cada uno de los elementos a su tipo personalizado.

Eso sería si tuviera que usar JAXB. Es posible que le resulte más fácil usar las API SAX o DOM directamente para datos como este. JAXB está realmente destinado a datos bien definidos que pueden representarse como un esquema.

+0

Gracias, eso tiene sentido. Vamos a seguir adelante y cambiar el esquema ya que tenemos esa capacidad por el momento. – chetan

0

Puede utilizar la herencia:

@XmlRootElement(name = "dog") 
public class MyDogObject extends MyChildObject { 
    //nothing here 
} 

@XmlRootElement(name = "cat") 
public class MyCatObject extends MyChildObject { 
    //nothing here 
} 

De esta manera se permite a lidiar con el mismo tipo de objeto, MyChildObject, sin embargo, controlar de forma flexible la estructura XML. Otra ventaja es que si define nodos XML específicos de perro/gato en el futuro, se pueden mapear en esa subclase correspondiente pero no en la otra, como se esperaba.

+0

Esto supone que conozco de antemano el universo de nombres de objetos para poder crear subclases. Por el momento, lo hago, pero parece un desperdicio. – chetan

Cuestiones relacionadas