Schémas XML
Les schémas XML
Les schémas XML (une recommandation du W3C datant du 2 mai 2001) sont aussi appelés XSD (Xml Schema Definition) ou XS (Xml Schema).
Concepts
Un schéma XML est un document XML validant un document XML, le schéma XML étant lui-même défini par une DTD. Cela n'est donc pas un remplaçant des DTD mais une alternative aux DTD.
Schémas VS DTD
Les schémas sont complexe mais beaucoup plus expressif que le DTD avec de très nombreux types prédéfinis. Possibilité de définition de nouveaux types, contraintes sur les contenus. Possibilité de définir précisément le nombre d'occurrences d'un élément. Espaces de noms supportés donc modularité.,Un format XML, donc possibilité de manipuler des schémas XML par des parseurs XML.
Exemple d'un fichier XML, sa DTD et son schéma XSD
Le fichier XML (bouquin.xml)
<?xml version="1.0" encoding="iso-8859-1"?> <listedestitres xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="bouquin.xsd"> <manuel> <titre>Windows XP pro</titre> <auteur>Pia Hardy</auteur> <auteur>Pia Timore</auteur> <editeur>Folio</editeur> <prix tva="TTC">15</prix> <image largeur="10" hauteur="50">couv.jpg</image> </manuel> <manuel> <titre>XSL pour les nuls</titre> <auteur>Jean dormesson</auteur> <editeur>ENI</editeur> <prix tva="TTC">20</prix> <image largeur="100" hauteur="50">couv2.jpg</image> </manuel> <manuel> <titre>HTML et CSS</titre> <auteur>Alphonse Dode</auteur> <editeur>Folio</editeur> <prix tva="TTC">10</prix> <image largeur="" hauteur="50">couv3.jpg</image> </manuel> </listedestitres>
Note: xsi pour XML Schema Instance
La DTD correspondante (bouquin.dtd)
<!ELEMENT listedestitres (manuel+)> <!ELEMENT manuel (titre,auteur+,editeur,description?,prix,image)> <!ELEMENT titre (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT editeur (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT prix (#PCDATA)> <!ATTLIST prix tva (TTC|HT) "TTC"> <!ELEMENT image (#PCDATA)> <!ATTLIST image largeur CDATA #REQUIRED hauteur CDATA #REQUIRED bordure CDATA #FIXED "0" alt CDATA #FIXED "Photo de la couverture" description CDATA #IMPLIED> <!ENTITY nomediteur "ENI">
Un schéma est constitué d'un élément schema et d'une variété de sous-éléments, les principaux étant element, complexType, et simpleType (comme string, decimal et NMTOKEN1) qui déterminent l'ordre d'apparition des éléments et leurs types de contenu.
Dans XML Schema, il y un une différence de base entre les éléments de type complexe qui peuvent contenir des sous-éléments et être qualifiés par des attributs et ceux de type simple qui ne peuvent contenir ni sous-éléments ni être qualifiés par des attributs.
Chacun des éléments du schéma est préfixé par xsd: associé à l'espace de noms du schéma XML utilisé par le biais de la déclaration xmlns:xsd="http://www.w3.org/2001/XMLSchema" qui est un attribut de l'élément schema.
Et le schéma correspondant (bouquin.xsd) (ou bouquin.xs)
<?xml version="1.0" encoding="iso-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.easy-micro.org" elementFormDefault="qualified"> <xsd:element name="listedestitres"> <xsd:complexType> <xsd:sequence> <xsd:element name="manuel" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="titre" type="xsd:string" /> <xsd:element name="auteur" type="xsd:string" maxOccurs="unbounded" /> <xsd:element name="editeur" type="xsd:string" /> <xsd:simpleType name="prix"> <xsd:restriction base="xsd:decimal"> <xsd:fractionDigits value="2" /> <xsd:maxLength value="5" /> </xsd:restriction> </xsd:simpleType> <xsd:element name="image" type="xsd:string" /> <xsd:attribute name="hauteur" type="xsd:decimal" use="required" default="50"/> <xsd:attribute name="largeur" type="xsd:decimal" use="optional" default="100"/> <xsd:attribute name="bordure" type="xsd:decimal" fixed="0" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
Explication sur la création du schéma de style "poupées russes"
1. on ouvre un élément obligatoire schema.
Cet élément accepte l'attribut "xmlns" qui permet de définir l'espace de nom cible
et qu'ils seront préfixés par un XSD ou un XS (dans ce cas, il faut rajouter l'attribut : xmlns:xs="http://www.w3.org/2001/XMLSchema").
L'attribut "targetNamespace" permet de spécifier que les éléments définit dans ce schema
(listedestitres, manuel, titre, auteur, éditeur, prix) viens de l'espace de nom "http://www.easy-micro.org".
L'attribut "elementFormDefault" indique que tout élément utilisé dans ce schéma doit être déclaré en espace de nom (namespace).
2. Ensuite, correspondant à la balise ouvrante de notre élément "listedestitres", nous définissons un élément qui aura ce nom. Cet élément ayant des attributs et des sous éléments, nous devrons le définir comme complexType, l'autre type de données ("simpleType") étant réservé aux éléments et attributs sans sous-éléments ou attributs et ne contenant donc que des valeurs.
3. La liste des sous éléments sera quand à elle décrite à l'intérieur d'un élément sequence. L'élément "sequence" (appelé compositeur) définit une liste ordonnée de sous éléments (autres compositeur: "choice" qui définit un groupe de particules et "all" qui définit un ensemble non ordonné d'éléments).
4. on recommence avec le deuxième élément (ici manuel) défini comme "complexType" puisque possède des sous-éléments. L' attribut maxOccurs="unbounded" (nombre maximum d'occurrences) signifie que l'élément peut être répété autant de fois que l'auteur du document le souhaite.
5. Ensuite nous décrivons tous les éléments ("titre", "auteur", "editeur", "prix"...) comme des types simples puisqu'ils n'ont pas de sous-éléments. L'attribut "type" défini le type de donnée (xs:string, xs:decimal, xs:integer, xs:boolean, xs:date, xs:time).
6. L'élément restriction et son attribut base permettent de définir des contraintes sur l'élément "prix", comme ici une taille maximale avec maxLength. Voir aussi la facette "pattern" qui permet de donner une expression régulière qui devra être vérifiée pour que la valeur soit acceptée. Par exemple, un numéro ISBN sans signe "-", est une chaîne de dix caractères numériques: <xsd:pattern value="[0-9]{10}"/>
7. On défini les attributs de l'élément "image" après l'avoir défini, les attributs devant toujours être déclarés après les éléments. L'attribut "default" permet de spécifier une valeure par défaut tandis que "use" déclare l'élément comme obligatoire et enfin l'attribut "fixed" affect une valeur définitive à cet attribut.
8. On termine la description de l'élément "manuel" en fermant les éléments "complexType" et "element".
9. La séquence des éléments pour l'élément "listedestitres" est également terminée.
2. Ensuite, correspondant à la balise ouvrante de notre élément "listedestitres", nous définissons un élément qui aura ce nom. Cet élément ayant des attributs et des sous éléments, nous devrons le définir comme complexType, l'autre type de données ("simpleType") étant réservé aux éléments et attributs sans sous-éléments ou attributs et ne contenant donc que des valeurs.
3. La liste des sous éléments sera quand à elle décrite à l'intérieur d'un élément sequence. L'élément "sequence" (appelé compositeur) définit une liste ordonnée de sous éléments (autres compositeur: "choice" qui définit un groupe de particules et "all" qui définit un ensemble non ordonné d'éléments).
4. on recommence avec le deuxième élément (ici manuel) défini comme "complexType" puisque possède des sous-éléments. L' attribut maxOccurs="unbounded" (nombre maximum d'occurrences) signifie que l'élément peut être répété autant de fois que l'auteur du document le souhaite.
5. Ensuite nous décrivons tous les éléments ("titre", "auteur", "editeur", "prix"...) comme des types simples puisqu'ils n'ont pas de sous-éléments. L'attribut "type" défini le type de donnée (xs:string, xs:decimal, xs:integer, xs:boolean, xs:date, xs:time).
6. L'élément restriction et son attribut base permettent de définir des contraintes sur l'élément "prix", comme ici une taille maximale avec maxLength. Voir aussi la facette "pattern" qui permet de donner une expression régulière qui devra être vérifiée pour que la valeur soit acceptée. Par exemple, un numéro ISBN sans signe "-", est une chaîne de dix caractères numériques: <xsd:pattern value="[0-9]{10}"/>
7. On défini les attributs de l'élément "image" après l'avoir défini, les attributs devant toujours être déclarés après les éléments. L'attribut "default" permet de spécifier une valeure par défaut tandis que "use" déclare l'élément comme obligatoire et enfin l'attribut "fixed" affect une valeur définitive à cet attribut.
8. On termine la description de l'élément "manuel" en fermant les éléments "complexType" et "element".
9. La séquence des éléments pour l'élément "listedestitres" est également terminée.
Voir aussi les autres type de schémas:
• Les schémas par référence (à un élément ou un attribut).
• Les schéma avec types nommés (en donnant un nom aux éléments "simpleType" et "complexType").
• Les schémas réutilisable pour découper un gros schéma ou constituer des bibliothèques de schémas.
-> Plus d'infos sur XMLfr
1 - NMTOKEN permet d'affecter un nom symbolique à l'attribut tel qu'un format de date, un format de fichier ou encore une abréviation