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) :
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
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>
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 <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>
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
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 } } } } }
Mon problème sont les listes imbriquées.
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>
Par exemple je voudrais pouvoir avoir ma class Food ressemblant a quelque chose comme ça :
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).
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 { }
Par exemple quand je veux connaitre le nombre de «typesOfUse» disponible je dois faire un
Alors que je m'attendais plus a faire un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part food.getTypesOfUse().getTypeOfUse().size();
Ce qui est syntaxiquement plus logique ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part food.getTypesOfUse().size();
Donc si vous avez une idée![]()
Partager