Rappel : document bien formé ou valide?!

Pour décrire la structure d’un document XML, on peut utiliser les DTDs (Document Type Definitions) ou les Schémas xml (XSD). Dans cette partie de cours, on va voir les grandes parties d’un document xsd : les éléments et les attributs.

validation xml

XSD : schémas xml pour la validation

Les schémas XML permettent comme  les DTD de définir des modèles de documents. Il est ensuite possible de vérifier qu’un document donné respecte un schéma.

Avantage des schémas xml :  

  •  Syntaxe XML 
  • Un grand nombre de types de données de base : booléens, entiers, intervalles de temps, etc. 
  • Il est possible de créer de nouveaux types : par ajout de contraintes sur un type existant, ….
  • La notion d’héritage : Les éléments peuvent hériter du contenu et des attributs d’un autre élément
  • Une grande facilité de conception modulaire de schémas 

Exemple : équivalence entre le DTD et les schémas xml

Fichier XML :
<?xml version="1.0" encoding="utf-8"?>
<cours>

<titre> Exemple 1 d'utilisation des schémas xml </titre>
<auteur>ELGARRAI Zineb</auteur>
<module>
<nom>Programmation Web Coté Client</nom>
<mh>180h</mh>
<date>2011-05-20</date>
</module>
<module>
<nom>Programmation Web Coté serveur</nom>
<mh>180h</mh>
<date>2011-03-21</date>
</module>
</cours> 

DTD :

 

<!ELEMENT cours (titre,auteur,module+)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT module (nom,mh,date)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT mh (#PCDATA)>
<!ELEMENT date (#PCDATA)

Le Fichier XSD équivalent :

<xsd:schema xmlns:xsd=http://www.w3.org/2000/10/XMLSchema …>
<xsd:element name="cours">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="titre" type="xsd:string"/>
<xsd:element name="auteur" type="xsd:string"/>
<xsd:element name="module" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nom" type="xsd:string"/>
<xsd:element name="mh" type="xsd:string" />
<xsd:element name="date" type="xsd:date"/> 
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="code" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema> 

Syntaxe XSD et référencement

Un schéma xml est un fichier xml avec extension « .xsd ». Comme tout document xml, un schéma xml commence par le prologue, puis l’élément racine.

Syntaxe :  

<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--Déclarations d'éléments, d'attributs et  définitions de types -->
...
</xsd:schema> 

Avec : 

xmlns: xsd = “http://www.w3.org/2001/XMLSchema”Indique que les éléments et types de données utilisés dans le schéma proviennent de l’espace de noms”http://www.w3.org/2001/XMLSchema”. Il spécifie également que les éléments et les types de données provenant de l’espace de noms “http://www.w3.org/2001/XMLSchema” doivent être préfixés par « xsd: » provenant de l’espace de noms “http://www.w3.org/2001/XMLSchema” doivent être préfixés par « xsd: »

Référencement : 

Le référencement d’un schéma XML se fait au niveau de l’élément racine du fichier XML grâce à l’utilisation de 2 attributs:

<?xml version="1.0" encoding="UTF-8"?>
<racine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="chemin_vers_fichier.xsd">
….
</racine>

XSD : éléments (Déclaration)

Syntaxe : <xsd:element name=”nom_element” type=”type_element”>

Exemples :   <xsd:element name=”date-naissance” type=”xsd:date”>

                     <xsd:element name=”nombre-enfants” type=”xsd:integer”>

Remarque : Valeur par défaut /Valeur fixe

on peut ajouter l’attribut default pour  spécifier la valeur par défaut , ou l’attribut fixed pour spécifier une

valeur fixe égale à “valeur” Les éléments peuvent être de type simple ou complexe 

1- Eléments de type simple

Définition :

Un élément simple est un élément XML qui ne peut contenir que du texte. Il ne peut contenir aucun autre élément ou attribut.

Remarque : Le texte peut être de plusieurs types différents. Il peut s’agir de l’un des types prédéfinis (booléen, chaîne, date, etc.), ou il peut s’agir d’un type personnalisé qu’on peut définir nous-même (restrictions ,union ou list ) 

Remarque : les types simples prédéfinis: 

  • Numériques : xsd:boolean, xsd:int ( 32 bits),  xsd:short  (16 bits), xsd:byte  (8 bits), xsd:long (64 bits), xsd:integer (entier sans limite de précision), xsd:positiveInteger  ( entier strictement positif sans limite de précision), xsd:negativeInteger (entier strictement négatif sans limite de précision),  xsd:float  (32 bits conforme à la norme IEEE), xsd:double (64 bits conforme à la norme IEEE), xsd:decimal ( Nombre décimal sans limite de précision)
  • Chaines de caractères  :  xsd:string, xsd:normalizedString ( pas de : tabulation / de saut de ligne / de retour chariot) , xsd:Name ( Nom XML),  xsd:language (Code de langue comme fr, en-GB), xsd:anyURI (comme http://www.istanticsafi.ma/~cours/).
  • Date  & Heures  : xsd:time format hh:mm:ss[.sss][TZ]. La partie .sss des secondes est optionnelle. Tous les autres champs sont obligatoires. L’heure peut être suivie d’un décalage horaire TZ qui est soit Z pour le temps universel soit un décalage commençant par + ou – comme -07:00.
    1.  xsd:date  : Date au format YYYY-MM-DD. Tous les champs sont obligatoires.
    2.  xsd:dateTime  :  Date et heure au format YYYY-MM-DDThh:mm:ss, Par exemple 2008-01-16T14:07:23. Tous les champs sont obligatoires
  • Types Hérités des DTD : xsd:ID (identifiant un élément), xsd:IDREF ( référence à un élément par son identifiant),  xsd:IDREFS , xsd:ENTITY(permet de faire référence à une entité le plussouvent non XML et déclaré dans des fichiers DTD), xsd:ENTITIES : liste d’entités externes non XML séparés par des espaces

On va traiter en détail les types simples dans la partie suivante du cours .

2- Eléments de type complexe

Définition :

Un élément est dit de type complexe s’il contient autres éléments (enfants) ou/et a des attributs. Il existe quatre types d’éléments complexes: 

  • éléments vides
  • éléments qui ne contiennent que d’autres éléments
  • éléments contenant uniquement du texte
  • éléments contenant à la fois d’autres éléments et du texte

Remarque: Chacun de ces éléments peut également contenir des attributs!

Eléments vides

<module code="M205"/>

Eléments qui ne contiennent que d’autres éléments 

<formateur>
<nom>ELGARRAI</nom>
<prenom>Zineb</prénom> 
</ formateur >

Eléments contenant uniquement du texte

 <examen type="pratique"> 
    Programmation web
</examen> 

Eléments contenant à la fois d’autres éléments et du texte

 <description>cours fait
à <dateSeance>2011-05-20</ dateSeance>
</description> 

Pour définir un type complexe, on peut utiliser la balise complexType :

<xsd:complexType ...>
...
</xsd:complexType> 

Le type peut être global et donc associé à un nom (Méthode 2) ou bien être local à un élément (Méthode 1)

Exemple : 

Méthode 1 ( Type anonyme) :

<xs:element name="formateur">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="nom" type="xs:string"/>
      <xs:element name="prenom" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element> 

Méthode 2 :

<xs:element name="employee" type=" infosFormateur"/>
<xs:complexType name="infosFormateur">
  <xs:sequence>
    <xs:element name="nom" type="xs:string"/>
    <xs:element name="prenom" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

Il est bien évident que la deuxième méthode favorise la réutilisation. 

Remarque : On peut également baser un élément complexe sur un élément complexe existant et ajouter des éléments (voir la notion d’extension).

 On peut contrôler COMMENT les éléments doivent être utilisés dans les documents avec des indicateurs : 

Indicateurs d’ordre

sequence, choice, all 

Indicateurs d’occurrences

maxOccurs, minOccurs

Indicateurs de groupes

xsd:group , xsd:attributeGroup.

Indicateurs d’ordre : 

– Opérateurs de séquences : xsd:sequence définit un nouveau type formé d’une suite des éléments en séquence ordonnée. C’est l’équivalent de l’opérateur ‘ , ‘ des DTD.

 

DTD :

<!ELEMENT livre (titre, auteur, isbn)>
< !ELEMENT titre (#PCDATA)>
< !ELEMENT auteur (#PCDATA)>
< !ELEMENT isbn (#PCDATA)> 

XSD :

<xsd:element name="livre">
  <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="titre" type="xsd:string"/>
        <xsd:element name="auteur" type="xsd:string"/>
        <xsd:element name="isbn" type="xsd:string"/>
     </xsd:sequence> 
  </xsd:complexType> 
</xsd:element> 

– Opérateurs de choix : xsd:choice définit un nouveau type formé d’une suite des éléments énumères de choix. C’est l’équivalent de l’opérateur ‘ | ‘ des DTD.

DTD :

<!ELEMENT publication (livre | article | 
rapport)>
< !ELEMENT livre (#PCDATA)>
< !ELEMENT article (#PCDATA)>
< !ELEMENT rapport (#PCDATA)>  

XSD :

<xsd:element name="publication">
  <xsd:complexType>
     <xsd:choice>
        <xsd:element name="livre" type="xsd:string"/>
        <xsd:element name="article" type="xsd:string"/>
        <xsd:element name="rapport" type="xsd:string"/>
     </xsd:choice> 
  </xsd:complexType> 
</xsd:element>

 – Opérateurs d’ensemble : Il définit un nouveau type dont chacun des éléments doit apparaître une fois dans un ordre quelconque.

Indicateurs d’occurrence :

Les attributs minOccurs et maxOccurs permettent de préciser le nombre minimal ou maximal d’occurrences d’un élément ou d’un groupe.  Ils sont l’équivalent des opérateurs ?, * et + des DTD.

L’attribut minOccurs prend un entier comme valeur. L’attribut maxOccurs prend un entier ou la chaîne unbounded comme valeur pour indiquer qu’il n’y a pas de nombre maximal.  La valeur par défaut de ces deux attributs est la valeur 1.

Exemple : soit en DTD : <!ELEMENT elem (elem1, elem2?, elem3*) > . Donner son equivalent en xsd

Indicateurs de groups :

Il est possible de nommer des groupes d’éléments et des groupes d’attributs afin de pouvoir les réutiliser. Ce mécanisme aide à structurer un schéma complexe et vise à obtenir une meilleure modularité dans l’écriture des schémas. Les groupes d’éléments et d’attributs sont respectivement définis par les éléments xsd:group et xsd:attributeGroup.

  xsd:group : permet de définir un groupe d’éléments dont le nom est donné par l’attribut name.  Le contenu de l’élément xsd:group est un fragment de type nécessairement inclus dans un élément xsd:sequence, xsd:choice ou xsd:all. L’utilisation d’un groupe est équivalente à l’insertion de son contenu. L’intérêt d’un groupe est de pouvoir l’utiliser à  plusieurs reprises et de factoriser ainsi les parties communes à plusieurs types.
 
Exemple : Donner un document xml valide selon ce schéma 
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="nom" type="xs:string"/>
    <xs:element name="prenom" type="xs:string"/>
    <xs:element name="date" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="formateur" type="infosFormateur"/>

<xs:complexType name="infosFormateur">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="matricule" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
</xs:schema> 

xsd:attributeGroup : permet de définir un groupe d’attributs dont le nom est donné par l’attribut name. Le contenu de l’élément xsd:attributeGroup est constitué de déclarations d’attributs introduites par l’élément xsd:attribute.

Exemple :

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="nom" type="xs:string"/>
  <xs:attribute name="prenom" type="xs:string"/>
  <xs:attribute name="date" type="xs:date"/>
</xs:attributeGroup>

<xs:element name="formateur">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element> 

Résumé Types Complexes : 
Un type complexe peut être construit explicitement ou être dérivé d’un autre type par extension ou restriction.

xsd : type complexe

xsd : attributs (Définition et déclaration)

 

L’attribut, ne contenant que du texte, ainsi il est de type simple. L’attribut peut être global et donc réutilisable au sein de plusieurs définitions de type complexe.

xsd:attribute name="nom_attribut" type="type_attribut"/>

Exemple :

<xsd:attribute name="langue" type="xsd:string"/>
<xsd:attribute name="categorie" type="xsd:string"/>
Remarque 1 : Attributs et Options
Les attributs sont facultatifs par défaut. Pour spécifier que l’attribut est obligatoire, utilisons l’attribut “use“: l’attribut   use de xsd:attribute peut prendre la valeur  optional ; required  ou  prohibited
 
Remarque 2: Attributs et Valeurs par défaut
Les attributs peuvent avoir une valeur par défaut (default) OU une valeur fixe spécifiée (fixed). Une valeur par défaut est automatiquement attribuée à l’attribut lorsqu’aucune autre valeur n’est spécifiée. Une valeur fixe est également automatiquement attribuée à l’attribut et nous ne pouvons pas spécifier une autre valeur.

Et voilà, c’est votre tours. On vous propose des exercices sur cette partie de cours : exercices sur XSD (TP1) 

Bravo! vous pouvez maintenant faire les exercices du premier TP sur les schémas xml : TP1 sur les schémas xml.

La partie suivante de cours va compléter le cours sur les schémas xml : détailler les types simples.

Vous pouvez suivre notre cours complet d’XML . pour approfondir vos compétences sur la création et la manipulation des documents xml, dtd, xsd,xpath, xslt.

Aussi, vous avez une playlist des vidéos (Explication en Darija arabe marocaine)  bien organisée qui traite : XML DTD XSD XSLT XPATH

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *