logo Mkadmi
Accueil            ISD            Equipe de recherche           Laboratoire Paragraphe            Enssib         ECP           Contact  

Accueil

 

 
 
 
 
   

 
 

webmaster

 
 
Chapitre 2 :Les Schémas XML

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:simpleType>

                                           <xsd:restriction base ="xsd:NMTOKEN">

                                                         <xsd:enumeration value ="TBD"/>

                                                         <xsd:enumeration value ="NA"/>

                                            </xsd:restriction>

                                </xsd:simpleType>

                    </xsd:union>

          </xsd:simpleType>

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.

Définition d’un type contenant le connecteur all

<xsd:complexType name ="typeNom">

          <xsd:all>

                       <xsd:element name ="nom" type ="xsd:string"/>

                       <xsd:element name ="prenom" type ="xsd:string"/>

          </xsd:all>

</xsd:complexType >

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"


Accueil            ISD            Equipe de recherche           Laboratoire Paragraphe            Enssib         ECP           Contact