2009-05-07 9 views
6

Je suis analyse d'un document XML qui a des nœuds comme les suivants:En utilisant JAXB à unmarshall éléments avec différents noms/dynamiques

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

DATA1 éléments, données2, data3 sont toujours cohérentes. Seule la balise parent varie. Dans mon modèle d'objet, j'ai un seul objet qui représente tous ces cas. Comment puis-je demander à JAXB de traiter ce cas sans connaître à l'avance le nom de l'élément? @ XMLAnyElement correspond à tous les objets mais ne crée pas un objet du type approprié; Je reçois une liste d'objets Node au lieu de mon objet. Mon objet ressemble actuellement quelque chose comme:

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; 
} 

Toute idée comment gérer ce court cas de modification du format XML entrant utiliser <object type="dog"> éléments?

Répondre

6

Si le nom est vraiment dynamique, je ne pense pas que JAXB vous aidera. Si vous avez un nombre défini de différents noms d'éléments, vous pouvez utiliser l'héritage comme l'autre article suggéré. Si le nombre d'éléments et noms est inconnu, je recommande d'utiliser quelque chose comme ceci:

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

Cela apporterait l'élément est juste un élément DOM. Vous pouvez ensuite utiliser JAXB une seconde fois pour passer de chacun des éléments à votre type personnalisé.

Ce serait le cas si vous deviez utiliser JAXB. Vous pourriez trouver plus facile d'utiliser directement les API SAX ou DOM pour des données comme celle-ci. JAXB est vraiment destiné à des données bien définies qui peuvent être représentées comme un schéma.

+0

Merci, cela a du sens. Nous allons aller de l'avant et changer le schéma puisque nous avons cette capacité pour le moment. – chetan

0

Vous pouvez utiliser l'héritage:

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

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

De cette façon, il vous permet de traiter avec le même type d'objet, MyChildObject, mais contrôler de manière flexible la structure XML. Un autre avantage est que si vous définissez des nœuds XML chien/chat spécifiques dans le futur - ils peuvent être mappés sur cette sous-classe correspondante mais pas sur l'autre, comme prévu.

+0

Ceci suppose que je connaisse au préalable l'univers des noms d'objets afin que je puisse créer des sous-classes. Pour le moment je le fais, mais cela me semble être une perte. – chetan