2010-09-17 6 views
2

J'ai besoin de mapper un XML, contraint par un objet XSD vers Java en utilisant XStream. Le XSD a 4 éléments de type complexe, qui sont des éléments de "choix", c'est-à-dire que l'un de ces 4 peut être présent dans le XML sous une étiquette racine.Xstream pour mapper les éléments "choice" de XML

J'ai regardé XStream mais il me semble que, pour cartographier un tel XML, j'aurais besoin de 8 classes. Comment? le voici ...

Dites par exemple que mon élément racine est VEHICLE et que chacun des types complexes dans le XML est a) CAR b) BIKE c) TRUCK d) TRACTEUR. Chacun d'eux a des propriétés différentes en leur sein. Pour mapper ceci à Xstream et rendre le XSD XML (généré par XStream), nous aurions besoin de 8 classes à savoir. VehicleCarWrapper -> (a) a voiture, VehicleTruckWrapper -> (a) a Camion, VehicleBikeWrapper -> (a) a Bike et VehicleTractorWrapper -> (a) a Tracteur.

Quelqu'un at-il une suggestion en dehors de la solution minable? Existe-t-il un moyen dans Xstream de mapper un tel élément "choice" d de la racine XML? Ainsi, tous les 4 (camion, voiture, vélo, tracteur) peuvent entrer dans le wrapper en tant qu'entités associées, mais XStream ignore toutes les associations sauf une à tout moment et crée donc un XML compatible XSD.

J'espère que ma question est claire.

Merci beaucoup!

Répondre

0

Voici la solution:

Classe de véhicule:

Véhicule public class { @XStreamAlias ​​("vehicleAttribute") chaîne vehicleAttribute;

}

classe Voiture:

@XStreamAlias("car") 
public class Car extends Vehicle { 
    @XStreamAlias("carattribute") 
    String carAttribute; 
} 

classe vélo:

@XStreamAlias("bike") 
public class Bike extends Vehicle { 
    @XStreamAlias("vehicleattribute") 
    String bikeAttribute; 
} 

Ensuite, une configuration XStream:

XStream xstream = new XStream(); 
    xstream.processAnnotations(Car.class); 
    xstream.processAnnotations(Bike.class); 
    xstream.processAnnotations(Vehicle.class); 

Créer des véhicules et dire XStream XML » em.

System.out.println(xstream.toXML(v1)); 
    System.out.println(xstream.toXML(v2)); 

Voici la sortie que vous voulez:

<car> 
    <carattribute>my car</carattribute> 
</car> 
<bike> 
    <vehicleattribute>my bike</vehicleattribute> 
</bike> 
0

Pourquoi ne pas utiliser JAXB à la place:

@XmlRootElement 
public class Foo { 
    @XmlElements(
     @XmlElement(name="car", type=Car.class), 
     @XmlElement(name="bike", type=Bike.class), 
     @XmlElement(name="truck", type=Truct.class), 
     @XmlElement(name="tractor", type=Tractor.class) 
    ) 
    public Vehicle vehicle; 
} 

Pour une comparaison des JAXB & XStream voir:

+0

Pour un exemple détaillé de mappage des structures de choix avec JAXB, voir: http://bdoughan.blogspot.com/2010/10/jaxb-and-xsd-choice-xmlelements.html –

Questions connexes