Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > Valider
Valider W3C XML Schemas, DTD, Relax NG, Schematron...) et tout ce qui permet de les mettre en oeuvre. Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/03/2012, 16h02   #1
kisuisje59
Invité de passage
 
Homme
Inscription : mars 2012
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2012
Messages : 1
Points : 0
Points : 0
Par défaut ComplexType composé d'éléments contextuellement variables?!

Bonjour,

Je cherche à définir un ComplexType (par exemple bookType) qui exigerait un certain nombre d'éléments en fonction du contexte dans lequel il est utilisé.
Par exemple sur une requète getBooks, l'objet book exigerait un ID pour en obtenir les détails.
Au contraire sur un getBooksResponse, on aurait l'ID certe mais aussi le Title et l'Author.

Si j'illustre:

getBooks


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="bookType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element name="bookId" type="xs:ID" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:element name="getBooks">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="books" minOccurs="1" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="1">
                            <xs:element name="book" type="bookType" minOccurs="1" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
et getBooksResponse


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="bookType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element name="bookId" type="xs:ID" minOccurs="1" maxOccurs="1" />
            <xs:element name="title" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="author" type="xs:string" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:element name="getBooksResponse">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="books" minOccurs="1" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="1">
                            <xs:element name="book" type="bookType" minOccurs="1" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
Le problème c'est le conflit de nom de bookType.
Soit je le créé une seule fois dans le fichier xsd avec tous les éléments qu'il peut supporter et j'ai pas de conflit mais j'ai plus non plus de controle au niveau des champs requis contextuellement... cqfd
Soit je le créé plusieurs fois dans différents fichiers xsd puis je les regroupe via un Main.xsd mais c'est du pareil au même, yaura conflit de nom.

Je vois pas trop comment faire en fait à part bien sur faire un bookType1 et bookType2 etc... mais dans ce cas il faut que je redéfinisse chaque élément du bookType pour chaque contexte d'utilisation!

C'est quoi les best practices dans ce cas de figure?

Merci beaucoup.
kisuisje59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2012, 17h29   #2
tsuji
Membre chevronné
 
Inscription : octobre 2011
Messages : 412
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 412
Points : 675
Points : 675
Citation:
Je vois pas trop comment faire en fait à part bien sur faire un bookType1 et bookType2 etc... mais dans ce cas il faut que je redéfinisse chaque élément du bookType pour chaque contexte d'utilisation!
C'est ça que vous devriez chercher de le faire. Puisque le nom book est toujours défini comme local, c'est déjà enlevé un sourci qui puisse vous placer dans une impasse.

Pour le faire avec plus de grâce et élégance, donc, accentuer les liens entre les types ainsi "proliférer", j'aurais tendé de le faire comme ça.
Code :
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
 
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="bookType">
        <xs:sequence>
            <xs:element name="bookId" type="xs:ID" />
        </xs:sequence>
    </xs:complexType>
 
    <xs:complexType name="bookTypeResponse">
        <xs:complexContent>
            <xs:extension base="bookType">
                <xs:sequence>
                    <xs:element name="title" type="xs:string" minOccurs="0" />
                    <xs:element name="author" type="xs:string" minOccurs="0" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
 
    <xs:element name="getBooks">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="books">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="book" type="bookType" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
 
    <xs:element name="getBooks">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="books">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="book" type="bookType" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
 
    <xs:element name="getBooksResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="books">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="book" type="bookTypeResponse" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
 
</xs:schema>
C'est pas si mal comme complication à mon avis.
tsuji est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h22.


 
 
 
 
Partenaires

Hébergement Web