IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

XSD => Java Imbrication d'objet sous forme de liste [JAXB]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 162
    Par défaut XSD => Java Imbrication d'objet sous forme de liste
    Bonjour,
    Désolé le titre est un peu flou, mais je le suis moi même.
    Je part de fichiers XSD que l'on me fournit (mais je peux les faire modifier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    		  <!-- XML Schema Generated from XML Document on Mon Jun 23 2014 11:20:05 GMT+0200 (Paris, Madrid (heure d’été)) -->
    		  <!-- with XmlGrid.net Free Online Service http://xmlgrid.net -->
     
     
    	   <xs:element name="food">
    			 <xs:complexType>
    				 <xs:sequence>
    					<xs:element name="uid" type="xs:string"></xs:element>
    					<xs:element name="summary" type="xs:string"></xs:element>
    					<xs:element name="typesOfUse">
    						<xs:complexType>
    							<xs:sequence>
    								<xs:element name="typeOfUse" maxOccurs="unbounded" type="common:LocalizedKeyValue">
    								</xs:element>
    							</xs:sequence>
    						</xs:complexType>
    					</xs:element>
    				</xs:sequence>
    			 </xs:complexType>
    	  </xs:element>
    </xs:schema>
    Dans un autre fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <xs:complexType name="LocalizedKeyValue">
    	<xs:sequence>
    		<xs:element name="key" type="xs:string"/>
    		<xs:element minOccurs="0" name="localizations">
    			<xs:complexType>
    				<xs:sequence>
    					<xs:element maxOccurs="unbounded" name="localization" minOccurs="0">
    						<xs:complexType>
    							<xs:sequence>
    								<xs:element name="lang" type="xs:string"/>
    								<xs:element name="value" type="xs:string"/>
    							</xs:sequence>
    						</xs:complexType>
    					</xs:element>
    				</xs:sequence>
    			</xs:complexType>
    		</xs:element>
    	</xs:sequence>
    </xs:complexType>
    Et je fait générer la classe Java correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "uid",
        "summary",
        "typesOfUse"
    })
    @XmlRootElement(name = "food2")
    public class Food2
        implements Cloneable, CopyTo, Equals, HashCode, ToString
    {
     
        @XmlElement(required = true)
        @NotNull
        protected String uid;
        @XmlElement(required = true)
        @NotNull
        protected String summary;
        @XmlElement(required = true)
        @NotNull
        protected Food2 .TypesOfUse typesOfUse;
     
       [...] // tous les accesseurs
     
     
     
        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {
            "typeOfUse"
        })
        public static class TypesOfUse
            implements Cloneable, CopyTo, Equals, HashCode, ToString
        {
     
            @XmlElement(required = true)
            @NotNull
            @Size(min = 1)
            protected List<Food2 .TypesOfUse.TypeOfUse> typeOfUse;
     
            [...] // tous les accesseurs
     
     
     
            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = {
                "key",
                "localizations"
            })
            public static class TypeOfUse
                implements Cloneable, CopyTo, Equals, HashCode, ToString
            {
     
                @XmlElement(required = true)
                @NotNull
                protected String key;
                @XmlElement(required = true)
                @NotNull
                protected Food2 .TypesOfUse.TypeOfUse.Localizations localizations;
     
                [...] // tous les accesseurs
     
     
     
                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "", propOrder = {
                    "localization"
                })
                public static class Localizations
                    implements Cloneable, CopyTo, Equals, HashCode, ToString
                {
     
                    @XmlElement(required = true)
                    @NotNull
                    protected Food2 .TypesOfUse.TypeOfUse.Localizations.Localization localization;
     
                    [...] // tous les accesseurs
     
     
     
                    @XmlAccessorType(XmlAccessType.FIELD)
                    @XmlType(name = "", propOrder = {
                        "lang",
                        "value"
                    })
                    public static class Localization
                        implements Cloneable, CopyTo, Equals, HashCode, ToString
                    {
     
                        @XmlElement(required = true)
                        @NotNull
                        protected String lang;
                        @XmlElement(required = true)
                        @NotNull
                        protected String value;
     
                        [...] // tous les accesseurs
     
                    }
                }
            }
        }
    }
    Le tout étant destiné à manipuler ce genre de contenue XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?xml version="1.0" encoding="utf-8"?>
    <food>
      <uid>str1234</uid>
      <summary>str1234</summary>
      <typesOfUse>
        <typeOfUse >
          <key>toto</key>
          <localizations>
            <localization>
              <lang>fr_FR</lang>
              <value>Test</value>
            </localization>
          </localizations>
        </typeOfUse >
        <typeOfUse >
          <key>toto</key>
          <localizations>
            <localization>
              <lang>es_ES</lang>
              <value>Test2</value>
            </localization>
          </localizations>
        </typeOfUse >
      </typesOfUse>
    </food>
    Mon problème sont les listes imbriquées.
    Par exemple je voudrais pouvoir avoir ma class Food ressemblant a quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Food
        implements Cloneable, CopyTo, Equals, HashCode, ToString
    {
    
        protected String uid;
        @XmlElement(required = true)
        @NotNull
        protected String summary;
        protected List<Food.TypeOfUse> typesOfUse;
    
     [...] // tous les accesseurs
    
        public static class TypeOfUse extends LocalizedKeyValue
            implements Cloneable, CopyTo, Equals, HashCode, ToString
        {
    
    
        }
    Mon problème est de créer une XSD qui valide le XML ET qui me génère la class comme souhaité. J'ai cette génération de class intermédiaire que est superflue et alourdie la syntaxe pour accéder à un objet (et plus d'être illogique).
    Par exemple quand je veux connaitre le nombre de «typesOfUse» disponible je dois faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    food.getTypesOfUse().getTypeOfUse().size();
    Alors que je m'attendais plus a faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    food.getTypesOfUse().size();
    Ce qui est syntaxiquement plus logique ...

    Donc si vous avez une idée

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 162
    Par défaut
    J'ai trouvé une solution.
    Il suffit d'utiliser un plugin pour Jaxb qui se trouve ici (jaxb-xew-plugin).
    Cela permet de générer les classes Java avec l'annotation @XMLWrapper, du coup le fichier XML générer est correcte et est valider par la XSD qui n'est pas affecté par ce changement.
    Que du bonheur quoi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/05/2015, 12h18
  2. Java recuperer le temps sous forme de long
    Par toure32 dans le forum Langage
    Réponses: 7
    Dernier message: 12/05/2011, 17h05
  3. Action de menu sous forme de liste
    Par frog43 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/12/2007, 13h33
  4. afficher des données sous forme de liste
    Par yannick9 dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/08/2007, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo