Les Schemas XML (recommandation XSD) |
|
|
XSD (XML Schema Definition) est une recommandation du W3C, depuis mai 2001, qui précise la manière de décrire formellement les éléments d'un document XML.
Les schémas XML se présentent comme une alternative aux DTD et palient aux limites de ces dernières. On définit ainsi un mécanisme de schéma (au sens des bases de données) pour exprimer des contraintes sur un type de document XML.
XSD propose en effet , en plus des fonctionnalités fournies par les DTD (définition de règles sur un document XML, sur les attributs et les relations des uns par rapport aux autres...) des nouveautés. Citons notamment :
- l'utilisation de la syntaxe XML
- le typage des données : de nombreux types sont intégrés (comme les booléens, les entiers, les intervalles de temps...). De plus il est possible d'ajouter des contraintes sur les types fournis
- la possibilité de créer ses propres types de données
- la notion d'héritage. Les éléments peuvent hériter du contenu et des attributs d'un autre élément.
- le support des espaces de nom.
- la facilité de conception et la modularité des schémas.
Le modèle de contenu devient davantage exhaustif avec les schémas XML qu'il ne l'était auparavant avec les DTD. En effet, outre que les schémas définissent tous les éléments et la structure constituant un document XML, ils déterminent également le nombre d'occurrences des éléments, gérent les contenus mixtes, les éléments nommés, les groupes d'attributs ainsi que des annotations utilisés pour la création d'une documentation à propos du modèle de contenu.
Le but d'un schéma est de définir une classe de documents XML, et donc le terme "document instance" est souvent utilisé pour définir un document qui est valide par rapport à un schéma donné.
Les schémas XML sont relativement complexes et ce sujet en lui-même pourrait nécessiter un site dédié. Aussi nous nous contenterons ici d'en présenter les grandes lignes, étant donné que ce n'est pas le coeur de notre sujet.
On l'a dit les schémas sont des documents XML. Ils comportent donc un prologue.
Ils utilisent les namespace (le préfixe xsd ou xs est utilisé). Un fichier de schéma (d'extension ".xsd") sera donc du style :
<?xml version="1.0" encoding="ISO-8859-1"> |
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
|
L'appel à un schéma dans le fichier de données se fera dans l'élément racine.
<?xml version="1.0" encoding="ISO-8859-1"> |
<elementRacine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="URIFichierXSD"> |
|
On l'a dit, une des forces de XSD est de proposer le typage des données. Nous allons donc nous intéresser de plus près à cette notion de typage. Pour affecter un type à un élément on utilisera une syntaxe du style :
<xsd:element name="nomElement" type="xsd:nomDUType"/> |
|
Un type est un ensemble de contraintes sur les contenus d'éléments et les valeurs d'attributs. Il en existe différents types :
- les types simples qui permettent de fixer des contraintes sur des éléments ne contenant ni sous-élément ni attributs
- les types complexes qui permettent eux de fixer des contraintes sur des éléments contenant des sous élément ou/et des attributs.
Un élément est de type simple s'il ne contient ni d'autres éléments ni d'attributs.
Les types simples sont donc prédéfinis ou dérivés de types prédéfinis.
Voici la liste des types prédéfinis, présentés selon leur hierarchie :

Par exemple, pour définir que l'élément "nom" doit être de type string on utilisera :
<xsd:element name="nom" type="xsd:string"/> |
|
On l'a dit on peut créé un nouveau type simple en dérivant un type prédéfini. On utilisera pour cela :
- une restriction : sous-ensemble des valeurs d'un type existant
- une liste : liste de valeurs d'un type existant
- une union : choix de valeurs parmi un ensemble de types existant
Au niveau syntaxique un type simple dérivé est déclaré par un élément "simpleType". On ajoutera un élément "restriction" , "list" ou "union" dans cet élément pour définir les modifications à apporter au type simple prédéfini.
<xsd:element name="age"/> |
|
<xsd:restriction base="xs:integer"> |
|
<xsd:minInclusive value="0"/> |
|
<xds:maxInclusive value="120"/> |
|
On contrôle ici que l'élément "age" est de type entier et qu'il est compris entre 0 et 120.
Les éléments de type complexe sont ceux qui contiennent d'autres éléments et/ou des attributs.
Les types complexes sont déclarés par l'élément "complexType" qui contient : des déclarations d'éléments contenus et/ou des déclarations d'attributs.
Les éléments sont déclarés par l'élément "element" et les attributs par l'élément "attribute".
<xsd:complexType name="adresse" > |
|
<xsd:element name="numero" type="xsd:decimal"/> |
|
<xsd:element name="nomRue" type="xsd:string"/> |
|
<xsd:element name="codePostal" type="xsd:decimal"/> |
|
<xsd:element name="ville" type="xsd:string"/> |
|
<xsd:element name="pays" type="xsd:string"/> |
|
<xsd:attribute name="pays" type="xsd:NMTOKEN" fixed="FR"/> |
|
On vérifie ici que un "élément" adresse est correct en analysant chacun de ses sous élément et son attribut.
Nous porposons ici un exemple de fichier message.xsd toujours basé sur notre exemple de message.

Le langage de schémas constitue donc une pièce essentielle dans la sphère XML, d'où son essort. Il assure une évolutivité, un dynamisme et une souplesse que les DTD ne permettent pas d'apporter.
Outre les DTD et les XML Schemas, il existe d'autres langages de schémas; citons notamment deux des plus connus d'entre eux :
- Relax NG (plus simple à mettre en oeuvre que les Schémas XML)
- Schematron (souvent utilisé en complément des Schémas XML ou de Relax NG).
Conclusion sur les Schémas |
Nous l'avons vu, l'approche par schémas est très intéressante et apporte un grand plus. On en devine notamment la portée pour des échanges entre systèmes hétérogènes : le format d'échange reste toujours identique (XML), mais on peut vérifier le contenu transféré à l'aide du typage de données, ce qui nous garantit une homogénéité des sources de données.