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