Exemple 14. Un premier exemple de XML schéma pour
marin.xml
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:galilee="http://www.galilee.org" targetNamespace="http://www.galilee.org" > <xsd:element name="marin"> <xsd:complexType> <xsd:sequence> <xsd:element name="nom" type="xsd:string"/> <xsd:element name="prenom" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
schema
, appartenant à l’espace de noms
http://www.w3.org/2001/XMLSchema
, préfixé par
xsd
. L’attribut
targetNamespace
indique que les éléments spécifiés dans ce schéma appartiennent à l’espace de noms
http://www.galilee.org
.
Ce schéma doit être sauvegardé dans un fichier particulier, on peut par exemple le nommer
marin.xsd
.
marin
est attaché au schéma enregistré dans
marin.xsd
? Les choses se font en fait en deux temps.
marin.xml
est attaché à ce schéma XML. En fait, ce que l'on déclare, c'est qu'une espace de noms est lui-même spécifié par un schéma XML, et que notre document est attaché à cet espace de noms.
marin.xsd
, dans lequel on indique que les objets attachés à ce schéma doivent vivre dans l'espace de noms spécifié.
marin
de la façon suivante.
Exemple 15. Attacher
marin.xml
à un XML schéma
<?xml version="1.0"?> <galilee:marin xmlns:galilee="http://www.galilee.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://www.galilee.org http://www.galilee.org/ns/marin.xsd"> <galilee:nom>Surcouf</galilee:nom> <galilee:prenom>Robert</galilee:prenom> </xsd:marin>
http://www.galilee.org/ns/marin.xsd
par la définition de l'attribut
xsi:schemaLocation
, qui comporte deux éléments : l'URI de l'espace de nom et l'URL du schéma XML correspondant.
http://www.w3.org/2001/XMLSchema
, désigné par le préfixe
xsd
en l’occurrence. Il s’agit effectivement d’un type standard et unique pour tous les schémas XML que l’on peut imaginer, et correspondant à une chaîne de caractères.
Le schéma XML de base déclare ainsi un certain nombre de types standard, dont voici les plus courants.
Exemple 17. Principaux types standard XML Schema
xsd:string xsd:decimal xsd:integer xsd:boolean xsd:date xsd:time
Exemple 18. Valeurs par défaut et valeur fixée pour un type simple
<xsd:element name="nom" type="xsd:string" default="Surcouf"/> <xsd:element name="prenom" type="xsd:string" fixed="Robert"/>
default
ou
fixed
à l’élément
xsd:attribute
.
Exemple 20. Déclarations de restrictions sur l’âge
<xsd:attribute name="age"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="150"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute>
simpleType
. Pour déclarer nos restrictions sur le type
age
, il faut utiliser le sous-élément
restriction
de
simpleType
. Cet élément prend lui-même d'autres sous-éléments dont
minInclusive
et
maxInclusive
.
Dans notre cas, les restrictions sont énoncées sur le type standard
integer
. Tous les types peuvent être utilisés ici, pas seulement les types standard.
Il existe de nombreux types de restrictions disponibles, on se reportera à la spécification pour en avoir la liste exhaustive.
Dans cet exemple, on déclare le type de
age
par un sous-élément de l’élément
attribute
. Cette déclaration est légale. Toutefois, on peut aussi déclarer un tel type différemment, en donnant un nom au
simpleType
, et en y faisant référence dans la déclaration de notre attribut, comme dans l’exemple suivant.
Exemple 21. Déclaration nommée de restriction sur l’âge
<xsd:simpleType name="ageType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="150"/> </xsd:restriction> </xsd:simpleType> <xsd:attribute name="age" type="ageType"/>
ageType
, et l’on y fait référence dans la déclaration de notre attribut. Cette deuxième façon de faire présente deux avantages :
ageType
dans autant de types simples que l’on veut ;
Exemple 23. Schéma XML pour un élément vide
<xsd:complexType name="marinType"> <xsd:attribute name="id" type="xsd:integer"/> </xsd:complexType>
simpleContent
ou
complexContent
.
unite
. Il s’agit d’un contenu simple (pas de sous-éléments), extension du type entier. On peut donc l’écrire de la façon suivante.
Exemple 25. Schéma pour un élément avec attribut et contenu entier
<xsd:complexType name="typeLongueur"> <xsd:simpleContent> <xsd:extension base="xsd:integer"> <xsd:attribute name="unite" type="xsd :string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType>
marin
, qui doit obligatoirement posséder un unique
nom
, un unique
prénom
, et autant de
commentaires
que l’on souhaite.
Un commentaire est un élément complexe, possédant un contenu textuel et un attribut qui indique la langue dans laquelle ce commentaire est écrit. Voici donc son schéma.
Exemple 26. Schéma pour l'élément commentaire
<xsd:complexType name="commentaireType"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="lang" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType>
lang
présent dans l’espace de nom standard, défini comme pouvant prendre des valeurs normalisées, désignant les langues existantes. On aurait tout à fait pu l’utiliser à la place de
xsd:string
.
On peut à présent créer notre schéma pour un élément marin, s’appuyant sur le
commentaireType
.
Exemple 27. Schéma pour un élément comportant des sous-éléments
<xsd:complexType name="marinType"> <xsd:complexContent> <xsd:sequence> <xsd:element name="nom" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="prenom" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="commentaire" type="commentaireType" minOccurs="0"/> </xsd:sequence> </xsd:complexContent> </xsd:complexType>
commentaireType
;
minOccurs
et
maxOccurs
de l’élément
element
.
Exemple 28. Schéma pour un élément comportant des sous-éléments nommés
<xsd:element name="nom" value="xsd:string"/> <xsd:element name="prenom" value="xsd:string"/> <xsd:complexType name="marinType"> <xsd:complexContent> <xsd:sequence> <xsd:element ref="nom" minOccurs="1" maxOccurs="1"/> <xsd:element ref="prenom" minOccurs="1" maxOccurs="1"/> <xsd:element name="commentaire" type="commentaireType" minOccurs="0"/> </xsd:sequence> </xsd:complexContent> </xsd:complexType>
sequence
, qui appartient à une famille appelée les
indicateurs
. Les indicateurs permettent de préciser la façon dont les sous-éléments s’organisent dans un document XML. Il existe trois types d’indicateurs : les indicateurs d’ordre, les indicateurs d’occurrence et les indicateurs de groupe.
Les indicateurs d’ordre sont les suivants :
sequence
, présentés dans nos exemples, impose que les éléments apparaissent dans l’ordre spécifié par le schema ;
choice
: permet à l’un des éléments d’être présent ;
all
: impose que tous les éléments soient présents une et une seule fois, mais dans n’importe quel ordre.
sequence
:
maxOccurs
: indique le nombre maximal de sous-éléments de ce type (peut prendre la valeur
unbounded
) ;
minOccurs
: indique le nombre minimal de sous-éléments de ce type (peut prendre la valeur 0).
group
;
attributeGroup
.
xsd:group
doit nécessairement contenir au moins un sous-élément
all
,
choice
ou
sequence
. On peut ensuite insérer ce groupe dans un autre sous-élément.
Les groupes d’attributs fonctionnent de la même façon, sauf qu’ils définissent des blocs d’attributs réutilisables. On les utilise en tant que sous-éléments de
complexType
, afin de définir les attributs de nos éléments.
Exemple 29. Définition et utilisation d’un groupe
<xsd:group name="PersonneGroup"> <xsd:sequence> <xsd:element name="nom" type="xsd:string"/> <xsd:element name="prenom" type="xsd:string"/> </xsd:sequence> </xsd:group> <xsd:complexType name="MarinType"> <xsd:sequence> <xsd:group ref="PersonneGroup"/> <xsd:element name="naissance" value="xsd:date"/> </xsd:sequence> </xsd:complexType>
mixed="true"
à l’élément
complexType
de déclaration. Notons que ce contenu textuel ne peut pas être contraint par la déclaration du schéma. On ne peut donc employer cette approche si l’on souhaite écrire des contraintes sur le contenu textuel de l’élément que l’on spécifie.
union
. L’union que l’on souhaite coder autorise les entiers compris entre 2 et 60, ou bien des chaînes de caractères pouvant prendre les valeurs « small », « medium » ou « large ».
Exemple 30. Schéma pour un type union
<xsd:simpleType name="sizeType"> <xsd:union> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="2"/> <xsd:maxInclusive value="60"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="small"/> <xsd:enumeration value="medium"/> <xsd:enumeration value="large"/> </xsd:restriction> </xsd:simpleType> </xsd:union> </xsd:simpleType>
DressSizeType
et
SMLSizeType
, correspondant respectivement au premier type simple et au second, que nous avons définis dans cet exemple.
Avec ces deux types simples, la définition de notre
union
devient le cas suivant.
Exemple 31. Schéma d’union référençant des types existants
<xsd:simpleType name="sizeType"> <xsd:union memberTypes="DressSizeType SMLSizeType"/> </xsd:simpleType>
Exemple 32. Restriction sur une union existante
<xsd:simpleType name="smallSizeType"> <xsd:restriction base="sizeType"> <xsd:enumeration value="2"/> <xsd:enumeration value="4"/> <xsd:enumeration value="6"/> <xsd:enumeration value="small"/> </xsd:restriction> </xsd:simpleType>
union
est définie par plusieurs types, comme c’est le cas de notre exemple, on peut préciser à quel type l’élément que l’on écrit appartient. C’est ce que l’on fait sur ce dernier exemple.
Exemple 33. Association d’un élément à un type interne d’une union
<size xsi:type="DressSizeType">12</size>
size
appartient au type
sizeType
, mais on décide de le restreindre au type interne
DressSizeType
, ce qui est légal. Cela permet de le valider plus précisément.
Exemple 34. Schéma pour un type liste
<xsd:simpleType name="smallSizeType"> <xsd:list itemType="DressSizeType"/> </xsd:simpleType>
memberTypes
de l'élément
xsd:union
est de type liste.
On peut appliquer des restrictions sur une liste, que l'on appelle des
facets
. Il existe trois types de
facets
:
length
,
minLength
et
maxLength
.
Exemple 36. Schéma pour un length facet
<xsd:simpleType name="AvailableSizesType"> <xsd:restriction> <xsd:simpleType> <xsd:list itemType="SMLSizeType"/> </xsd:simpleType> <xsd:maxLength value="3"/> </xsd:restriction> </xsd:simpleType>
Exemple 37. Schéma pour un enumeration facet
<xsd:simpleType name="AvailableSizesType"> <xsd:restriction> <xsd:simpleType> <xsd:restriction base="xsd:token"> <xsd:enumeration value="small"/> <xsd:enumeration value="medium"/> <xsd:enumeration value="large"/> </xsd:restriction> </xsd:simpleType> </xsd:restriction> </xsd:simpleType>
enumeration
en tant que sous-éléments de
simpleType
plutôt que de
restriction
, on restreignait la liste complète à ne prendre que les trois valeurs
small
,
medium
et
large
. On interdisait par exemple à la liste de prendre la valeur « small medium ».
Enfin on peut fixer un
pattern facet
en ajoutant un sous-élément
pattern
à l’élément
restriction
.
Exemple 38. Schéma pour un pattern facet
<xsd:simpleType name="VectorType"> <xsd:restriction> <xsd:simpleType> <xsd:list itemType="xsd:unisgnedInt"/> </xsd:simpleType> <xsd:pattern value="((\d+\s*){3})*"/> </xsd:restriction> </xsd:simpleType>
Node
NodeList
Element
Attr
CharacterData
Comment
CDATASection
Text
Entity
EntityReference
ProcessingInstruction
Document
DocumentFragment
DocumentType