Bonjour,

Je voudrais savoir les éléments que je doit choisir entre eux lors de l'invoquation d'une opération d'un service web SOAP.

Ci joint l'élement input d'une opération. qui contient les paramêtres d'invoquation du l'opération "operationName".

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<xs:complexType name="operationNameRequest">
                <xs:sequence>
                     <xs:element name="aaaa" type="xs:string"/>
                    <xs:choice>
                        <xs:element name="id" type="xs:long"/>
                        <xs:element name="CityName" type="xs:string"/>
                        <xs:element name="contryName" type="xs:string"/>
                    </xs:choice>              
                    <xs:element name="validFromDate" type="xs:string"/>
                    <xs:element name="nbOccurences" type="xs:int" minOccurs="0"/>
                </xs:sequence>
</xs:complexType>
Ainsi lors de l'invoquation du l'opération "operationName" je dois choisir un seul élement entre les trois elements "id", "CityName" et "ContryName".
supposons que nous avons récuperé la définition globale de l'élement input de cette opération.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SchemaGlobalElement elm = operation.getOperation().getInterface()
					.getWsdlContext().getSchemaTypeLoader()
					.findElement(elementName);
avec elementName c'est un Qname qui represente le nom qualifié de l'input du l'opération.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SchemaProperty[] sp = elm.getType().getProperties();
        for (int i = 0; i < sp.length; i++) {
            if (!sp[i].getType().isSimpleType()) {
                if (sp[i].getType().getContentModel().getParticleType() == SchemaParticle.CHOICE) {
                    System.out.println(sp[i].getName().getLocalPart()
                            + " complex type,particle tree: CHOICE");
                }
            } else {
                System.out.println(sp[i].getName().getLocalPart()
                        + ": is simple ");
            }
        }
Ainsi nous avons récuperé tous les élements qui répresentent les paramêtres du l'opération qu'on veut l'invoquer qui sont stockés dans un tableau de SchemaProperty. On parcourt cet tableau et on affiche le nom de chaque élement et s'il est de type complex, on détermine si son contenu est CHOICE.
En fait le modèle du contenu d'un élément complexe est une arbre des particules. Chaque particule est soit CHOICE, soit ALL ou soit SEQUENCE.

cette méthode de SchemaType
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sp[i].getType().getContentModel()
retourne un tableau de SchemaParticle qui représente l'arbre des particules.

Le problème ici que le tableau schemaProperty contient six éléments qui sont tous de type simple.
et on peut savoir que le contenu est CHOICE si l'élement est complexe. Donc comment je pourrais savoir s'il vous plaît qu'il ya un choix entre ces troies élements
"id", "CityName" et "contryName".
si l'exemple était comme ceci
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
 
<xs:complexType name="operationNameRequest">
                <xs:sequence>
                     <xs:element name="aaaa" type="xs:string"/>
                      <xs:element name="id" type="xs:long"/>
					  <xs:element name="ContryService">
                        <xs:complexType>
							<xs:choice>
								<xs:element name="id" type="xs:long"/>
								<xs:element name="CityName" type="xs:string"/>
								<xs:element name="contryName" type="xs:string"/>
							</xs:choice>   
						</xs:complexType>							
                    <xs:element name="validFromDate" type="xs:string"/>
                    <xs:element name="nbOccurences" type="xs:int" minOccurs="0"/>
                </xs:sequence>
</xs:complexType>
Je peux savoir facilement que je dois choisir un element parmis les trois element "id", "cityName" et "contryName" car le contenu de "ContryService" est CHOICE donc je stocke ses enfants et apres je dois choisir un de ses enfants. Mais l'exemple précédent n'est pas le cas.

Merciii.