2011-09-05 2 views
3

Est-il possible de mapper un schéma XML existant vers des classes Java existantes?jaxb avec des classes et un schéma existants

J'ai plusieurs schémas XML et j'ai besoin de les mapper tous à une classe java. Les fichiers XML diffèrent un peu en ce qui concerne le stockage des données. E.g.

public class DataStorage { 
    public String data1; 
    public String data2; 
    public String data3; 
} 

et un ensemble de différents fichiers xml

<?xml ...?> 
<dataCase1> 
<data1>...</data1> 
<data2>...</data2> 
<data3>...</data3> 
</dataCase1> 

<?xml ...?> 
<dataCase2> 
<data data1="..." data2="..." data3="..." /> 
</dataCase2> 

<?xml ...?> 
<dataCase3> 
<data> 
<innerData> 
<data1>...</data1> 
</innerData> 
<otherData data2="..."> 
<data3>...</data3> 
</otherData> 
</data> 
</dataCase3> 

Il pourrait y avoir beaucoup d'autres variantes de fichiers XML.

Est-il possible de lier tous ces fichiers à la classe java en utilisant jaxb?

+0

Oui, vous pouvez. Construire des paquets pour chaque schéma xml et les lier à votre classe. – umbr

+0

Pourriez-vous s'il vous plaît décrire plus en détail? –

Répondre

2

Vous pouvez utiliser l'implémentation EclipseLink MOXy de JAXB pour y parvenir. Autant que je comprends, vous devrez toujours créer des classes différentes pour différents types de schéma mais vous pouvez réutiliser vos objets de domaine.

Pour continuer avec votre exemple:

DataStorage classe avec 3 objets de domaine (data1, data2, data3), représentés comme Strings simplistes, peut être vraiment tout objet mis en correspondance JAXB de domaine.

  • Schema type 1

    @XmlRootElement(name = "dataCase") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class DataStorage { 
        private String data1; 
        private String data2; 
        private String data3; 
    
        /** 
        * No-arg ctor needed by jaxb. 
        */ 
        private DataStorage() {} 
    
        public DataStorage(String data1, String data2, String data3) { 
         this.data1 = data1; 
         this.data2 = data2; 
         this.data3 = data3; 
        } 
    
    } 
    
  • Type Schéma 2. Notez l'utilisation de l'annotation @XmlPath.

    @XmlRootElement(name = "dataCase") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class DataStorage { 
        @XmlPath("data/@data1") 
        private String data1; 
        @XmlPath("data/@data2") 
        private String data2; 
        @XmlPath("data/@data3") 
        private String data3; 
    .... 
    
  • type de schéma 3. Encore une fois tirer parti de @XmlPath.

    @XmlRootElement(name = "dataCase") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class DataStorage { 
        @XmlPath("data/innerData/data1/text()") 
        private String data1; 
        @XmlPath("data/otherData/@data2") 
        private String data2; 
        @XmlPath("data/otherData/data3/text()") 
        private String data3; 
    .... 
    
  • Marshalling

    JAXBContext jc = JAXBContext.newInstance(DataStorage.class); 
    Marshaller marshaller = jc.createMarshaller(); 
    DataStorage dataStorage = new DataStorage("data 1", "data 2", "data 3"); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(dataStorage, System.out); 
    

Voir this post du blog du chef d'équipe Moxy pour moi l'information.

+0

+1 - Vous pouvez également utiliser le fichier de métadonnées XML de MOXy pour appliquer plusieurs mappages à votre modèle de domaine. Pour un exemple voir: http://stackoverflow.com/questions/6838882/jaxb-annotations-extract-xml-value-from-xml-element –

+0

@Blaise C'est génial. Cela sera utile dans un certain temps :) –

+0

Voici un exemple plus détaillé que j'ai mis en place démontrant plusieurs mappages sur un seul modèle d'objet: http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple- xml-schemas.html –

1

Vous pouvez utiliser XSLT pour traduire vos différents formats XML en un seul format unifié.

Questions connexes