XML
fût pressenti dès son arrivée comme une technologie
qui allait révolutionner l'échange de données. Cependant,
les DTD, comme langage de schéma utilisé pour spécifier
le contenu et la structure de documents XML, souffrent
de quelques déficiences :
- Les
DTD ne sont pas écrites en XML, ce qui signifie
que les technologies existantes pour manipuler des
documents XML telles que DOM ou SAX ne peuvent être
utilisées pour « parser » des schémas de documents.
- Les
DTD ne supportent pas les espaces de nom ce qui
rend impossible l’import de schémas externes afin
de réutiliser du code existant.
- Les
DTD n'offrent qu'un typage très limité des données.
Conscient
de ces fgrandes limitations, le W3C a proposé un nouveau
langage de définition de schéma de documents qu’est
XML Schema.
Conçu
pour palier aux déficiences pré-citées des DTD, XML
Schema propose, en plus des fonctionnalités fournies
par les DTD, plusieurs nouveautés à savoir :
- Un
grand nombre de types de données intégrées comme
les booléens, les entiers, les intervalles de temps,
etc. De plus, il est possible de créer de nouveaux
types par ajout de contraintes sur un type existant.
- Des
types de données utilisateurs qui nous permettent
de créer notre propre type de données nommé.
- La
notion d'héritage : Les éléments peuvent hériter
du contenu et des attributs d'un autre élément.
C'est sans aucun doute l'innovation la plus intéressante
de XML Schema.
- Le
support des espaces de nom.
- Les
indicateurs d'occurrences des éléments peuvent être
tout nombre non négatif.
- Une
grande facilité de conception modulaire de schémas.
XML
Schema a un statut de recommandation du 2 Mai
2001, dont les spécifications sont disponibles à :
http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/
http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/
http://www.w3.orgltr/2001/REC-xmlschema-2-20010502/
XML
Schema par l’exemple
Je
vais présenter en ce qui suit un fichier XML, avec
la DTD et le schéma XML qui vont avec. Ces trois fichiers
sont édités et générés par l’outil XML SPY.
Fichier
XML : arborescence.xml
DTD
associée à l’arborescence :
<?xml
version="1.0" encoding="UTF-8"?>
<!ELEMENT racine (repertoire | fichier)+>
<!ELEMENT repertoire (#PCDATA | repertoire | fichier)*>
<!ATTLIST repertoire
nom (XML | exemples | outils) #REQUIRED
date_modif CDATA #REQUIRED
heure_modif (14:12 | 14:14 | 16:09) #REQUIRED
>
<!ELEMENT fichier (#PCDATA)>
<!ATTLIST fichier
nom (XMLSPY.exe | XMLSPY.xml | séminaire.xml)
#REQUIRED
taille (2 | 8) #REQUIRED
unite_taille (KO | MO) #REQUIRED
date_modif (12-02-2001 | 28-01-2001) #REQUIRED
heure_modif (12:12 | 14:12 | 15:12) #REQUIRED
>
XML
schema associé à l’arborescence : arborescence.xsd
3
Les types simples
Le
document XML Schema fournit deux types de définition
de type de données": simple et complexe.
Les
types simples incluent les types de base inclus dans
la bibliothèque standard des XML Schema, les listes
et les unions.
3.1
Les types de base intégrés
XML
Schema apporte la notion, comme pour les langages,
de type de bases prédéfinis et qui sont assez évolués.

Il
s’agit d’une nouveauté importante, puisque les DTD se
contentaient de types de données plutôt limités (PCDATA,
CDATA …).
Les
types de données simples les plus courants sont représentés":
chaînes de caractères, entiers, dates, réels, etc.
Les types de données des DTD ont été repris par XML
Schema pour des raisons de compatibilité ascendante.
3.2
Les listes
Les
types listes sont des suites de types atomiques. XML
Schema possède 3 types de listes intégrés qui sont
NMTOKENS, ENTITIES et IDREFS. En plus de ces listes
intégrées, nous pouvons créer de nouveaux types de
listes par dérivation de types atomiques existants.
Toutefois la création de types de liste à partir de
listes ou de types complexes n’est pas permise, ceci
afin d’éviter des schémas trop complexes.
Exemple de définition de liste pour un
attribut
<xsd:attribute name ="unite-taille"
use ="required">
<xsd:simpleType>
<xsd:restriction
base ="xsd:NMTOKEN">
<xsd:enumeration
value ="KO"/>
<xsd:enumeration
value ="MO"/>
<xsd":enumeration
value ="GO"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
3.3
Les unions
XML
Schema permet la définition d’éléments union.
Les éléments peuvent avoir des contenus variables
sur des types différents.
Exemple de contenu variable pour l’ISBN
<xsd:simpleType
name ="isbnType">
<xsd:union>
<xsd:simpleType>
<xsd:restriction
base ="xsd":string">
<xsd:pattern
value ="[0-9]{10}"/>
</xsd:restriction>
<xsd:simpleType>
<xsd:restriction
base ="xsd:NMTOKEN">
<xsd:enumeration value ="TBD"/>
<xsd:enumeration value ="NA"/>
</xsd:restriction>
4
Les types complexes
Les
types de données simples ne permettent pas aux éléments
de contenir des sous-éléments. Pour cela, XML Schema
définit le type de données complexes, pouvant être
créé par un auteur de schéma.
Un
type de données complexe peut être caractérisé par
son modèle de contenu ; c'est-à-dire comment ses sous-éléments
sont susceptibles d'apparaître.
Un type complexe est défini à l'aide de l'élément
<xsd:complexType name="..."> qui pourra contenir,
entre autres, une séquence d'éléments, une série d'attributs,
etc.
XML
Schema propose un ensemble de connecteurs permettant
de représenter n'importe quel modèle de contenu exprimable
à l'aide d'une DTD":
•
Le connecteur de séquence
•
Le connecteur de choix
•
L'élément All" "(ANY
dans les DTD)
4.1.
Le connecteur de séquence
Le
connecteur de séquence permet de définir un type complexe
comportant des suites d'éléments. Le connecteur séquence
définit une liste ordonnée de sous éléments
Pour
pouvoir rendre des éléments optionnels, il faut appliquer
des contraintes d'occurrences sur les éléments.
Définition d’une séquence pour l’élément
racine
<xsd:element>
<xsd:complexType>
<xsd:sequence>
<xsd:element
ref ="repertoire"/>
<xsd:element
ref ="fichier"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Le
connecteur de séquence de XML Schema reproduit donc
fidèlement l'opérateur de séquence des DTD(,)
4.2.
Le connecteur de choix
Le
connecteur de choix permet de définir un type complexe
comportant des éléments variables. Il n'autorise qu'un
seul de ses fils soit présent dans le document instance.
Pour
pouvoir autoriser l'un ou l'autre ou les deux, il
faut appliquer des contraintes d'occurrences sur l'élément
xsd: choice.
Définition d’une alternative pour le répertoire
<xsd:choice minOccurs ="0" maxOccurs ="unbounded">
<xsd:element ref
="repertoire"/>
<xsd:element
ref ="fichier"/>
</xsd:choice>
Le
connecteur de choix de XML Schema a donc les mêmes
caractéristiques que l'opérateur ou (|) des DTD
4.3.
L'élément all
L'élément
all représente un connecteur supplémentaire par rapport
aux DTD. Il permet à ses éléments fils d'apparaître
une fois (ou pas du tout) et dans n'importe quel ordre.
Le
connecteur all doit apparaître
comme fils unique du plus haut niveau du modèle de
contenu, c’est à dire comme fils unique de l’élément
complexType.
Les
fils de l’élément peuvent apparaître au plus une fois.
5
les types de contenus
XML
Schema permet de différencier les types de contenu":
- Des
éléments et attributs sans sous éléments ou attributs,
et ne contenant donc que des valeurs":
Xsd":simpleType
<xsd:attribute name="unite_taille" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="KO"/>
<xsd:enumeration value="MO"/>
<xsd:enumeration
value="GO"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
- Des
éléments ayant des sous-éléments et/ou des attributs":
xsd":
complexType
<xsd:element name="racine">
<xsd:complexType>
<xsd:sequence>
<xsd:element
ref="repertoire">
<xsd:element ref="fichier">
</xsd:sequence>
</xsd:complexType>
</xsd:element>
- Des
éléments à contenu vide avec seulement des attributs":
xsd:complexType
<xsd:complexType="typeDate">
<xsd:attribute name="jour"
type="xsd:byte">
<xsd:attribute name="mois"
type="xsd:byte">
<xsd:attribute name="annee"
type="xsd:byte">
</xsd":complexType>
- Des
éléments à contenu simple, avec texte et attributs":
xsd":simpleContent
<xsd:element name="internationalPrice">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:decimal">
<xsd:attribute name="currency" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
- Des
éléments ayant des sous éléments et/ou attributs
et du texte, c’est à dire le type mixte des DTD":
xsd":complexType mixed ="true”
Exemple
d'un type complexe
- On
peut également, pour l’élément complexType avoir
le paramètre content
="valeur"":
- "
elementOnly": uniquement
des sous éléments
- "
textOnly": uniquement du
texte simple
- "
mixed": sous éléments combinés
avec texte simple
- "
empty": pas de sous éléments
6.
Les dérivations de types
XML
Schema propose deux techniques de dérivations de
types : la première appelée dérivation par restriction
du type ancêtre, et la seconde appelée dérivation
par extension du type ancêtre.
Ces
deux mécanismes de dérivation s'appliquent aussi
bien aux types de données simples que complexes,
ce qui les rend très puissants.
6.1.
Dérivation par restriction
Les
différents types de restrictions sont appelés "facettes",
et XML Schema dispose de nombreuses facettes en
standard. Ces facettes permettent de définir des
contraintes telles que"longueur, valeurs extrêmes,
précision, durée, liste de valeurs possibles, ...
Il
existe un nombre important de 'facettes' qui permettent
de
•" "fixer
la longueur d'un type simple, restreindre sa longueur
maximale et minimale,
•" "énumérer
toutes les valeurs possibles d'un type,
•" "gérer
des expressions régulières,
•" "fixer
la valeur minimale ou maximale d'un type (voir ci-dessus),
•" "fixer
la précision du type, ...
Les
verbes associés sont, dans l'espace de nom xsd":
- "
minExclusive, minInclusive,
maxExclusive, maxInclusive
- "
precision,
scale, length, minLength,maxLength encoding
- "
period, duration, enumeration,
pattern
•
pattern permet de préciser
une expression régulière.
6.2
Dérivation par extension
Le
mécanisme de dérivation par extension de XML Schema
est plus proche conceptuellement du mécanisme d’héritage
des langages orientés objet. Il permet par exemple
de rajouter des éléments ou des attributs au modèle
complexe de base. Il permet également de définir
des types d’éléments contenant les données communes
(attributs et/ou éléments et/ou texte) à plusieurs
éléments.
<"!—Définition
d’un type des données communes pour repertoire et
fichier-- >
<xsd":complexType name=”typeconteneur”
mixed="true”>
<xsd:attribute name = “nom” type = “xsd:string”
use = “required”/>
<xsd:attribute name = “date_modif” type
= “xsd:string” use = “required”/>
<xsd:attribute name = “heure_modif”"type
= “xsd:time” use = “required”/>
</xsd:comlexType>
<! – Définition de l’élément repertoire par extension -
- >
<xsd:element name ="repertoire">
<xsd:complexType mixed ="true">
<xsd:complexContent mixed=
“true”>
<xsd:extension base= “typeconteneur”>
<xsd:choice minOccurs = “0”
maxOccurs = “unbounded”>
<xsd:element ref= “repertoire”/>
<xsd:element ref = “fichier”/>
</xsd:choice>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<! – Définition de l’élément fichier par
extension - - >
<xsd:element name = “fichier”>
<xsd:complexType mixed ="true">
<xsd:complexContent mixed=
“true”>
<xsd:extension base= “typeconteneur”>
<xsd:attribute name = “taille”
type= “xsd:integer” use= “required”/>
<xsd:attribute name = “unite_taille”
use= “required”/>
<xsd:simpleType>
<xsd:restriction base= “xsd:NMTOKEN”>
<xsd:enumeration value= “KO”/>
<xsd:enumeration value= “MO”/>
<xsd:enumeration value= “GO”/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
6.3.
Notions complémentaires
XML
Schema apporte bien d'autres notions telles que":
•
Groupes de substitutions": remplacement d'élément
par d'autres éléments,
•
Elements et types abstraits": forcer à utiliser
uniquement les éléments ou types dérivés,
•
Types anonymes": pour éviter d'avoir à définir
et nommer des éléments référencés une seule fois,
•
Inclusion de XML Schema": pour la modularisation
et réutilisation de XML Schema dans un même espace
de noms,
•
Redéfinition de types": pour la surcharge des
types simple, complexes, attribut ou groupe d'attributs
issus du schéma externe,
•
Importation de types": pour la modularisation
et réutilisation de XML Schema d'espaces de noms
différents,
•
Contraintes référentielles": contrôle d'unicité
à un niveau, de clé primaire et de clé étrangère.
7
Référencement d'un schéma XML
L'association
d'un document XML à un XML Schema se fait grâce
à deux attributs de XML Schema-instance
- Sans
définition d'espace de noms
--->
xsi: noNamespaceSchemaLocation="
Nom FichierSchema.xsd"
<racine
xmlns":xsi ="http://www.w3.org/2000/10/XMLSchema-instance"
""xsi":noNamespaceSchemaLocation
="core_component.xsd"
(Référence qui contient le schéma)
- avec
définition d'un espace de nom
--->
xsi:SchemaLocation="
URI EspaceDeNom NomFichierSchema.xsd"
<racine
xmlns:xsi ="http://www.w3.org/2000/10/XMLSchema-instance"
xsi:SchemaLocation="http://www.edifrance.org/formation%20%20core_component.xsd"
|