Link Search Menu Expand Document

Introduction aux définitions et aux DTD

Dans la première partie, nous avons découvert ce qu’était le XML. Pour ne rien vous cacher, le XML est très peu utilisé seul et on préfère souvent l’utiliser en parallèle d’autres technologies permettant d’étendre ses possibilités. L’étude de ces autres technologies débute donc maintenant ! Nous allons aborder les technologies qui permettent de définir une structure stricte aux documents XML : les fichiers de définition.

Il existe plusieurs technologies qui permettent d’écrire des fichiers de configuration, nous en verrons 2 dans cette seconde partie. Débutons tout de suite avec les DTD.

Qu’est-ce que la définition d’un document XML ?

Avant de foncer tête baissée dans la seconde partie de ce cours, il est indispensable de revenir sur quelques termes qui seront importants pour la suite de ce tutoriel.

Quelques définitions

Définition d’une définition

Une définition d’un document XML est un ensemble de règles que l’on impose au document. Ces règles permettent de décrire la façon dont le document XML doit être construit. Elles peuvent être de natures différentes. Par exemple, ces règles peuvent imposer la présence d’un attribut ou d’une balise, imposer l’ordre d’apparition des balises dans le document ou encore, imposer le type d’une donnée (nombre entier, chaîne de caractères, etc.).

Un document valide

Dans la partie précédente, nous avons vu ce qu’était un document bien formé. Cette seconde partie est l’occasion d’aller un peu plus loin et de voir le concept de document valide.

Un document valide est un document bien formé conforme à une définition. Cela signifie que le document XML respecte toutes les règles qui lui sont imposées dans les fameuses définitions.

Pourquoi écrire des définitions ?

Vous vous demandez certainement à quoi servent ces définitions et pourquoi on les utilise, n’est-ce pas ?

Associer une définition à un document oblige à une certaine rigueur dans l’écriture de vos données XML. C’est d’autant plus important lorsque plusieurs personnes travaillent sur un même document. La définition impose ainsi une écriture uniforme que tout le monde doit respecter. On évite ainsi que l’écriture d’un document soit anarchique et, par conséquent, difficilement exploitable.

Le plus souvent, par un programme informatique ! Vous pouvez par exemple écrire un programme informatique qui traite les données contenues dans un document XML respectant une définition donnée. Imposer une définition aux documents que votre programme exploite permet d’assurer un automatisme et un gain de temps précieux :

  • Le document n’est pas valide : je ne tente pas de l’exploiter.
  • Le document est valide : je sais comment l’exploiter.

Pour terminer cette longue introduction, sachez que vous avez le choix entre deux technologies pour écrire les définitions de vos documents XML : les DTD ou les schémas XML.

Définition d’une DTD

Une définition rapide

Une Document Type Definition ou en français une Définition de Type de Document, souvent abrégé DTD, est la première technologie que nous allons étudier pour écrire les définitions de nos documents XML.

Comme nous l’avons déjà précisé dans l’introduction de cette seconde partie, le but est d’écrire une définition de nos documents XML, c’est-à-dire, de construire un ensemble de règles qui vont régir la construction du document XML.

Grâce à l’ensemble de ces règles, nous allons ainsi définir l’architecture de notre document XML et la hiérarchie qui existe entre les balises de celui-ci. Ainsi, on pourra préciser l’enchaînement et le contenu des balises et des attributs contenus dans le document XML.

Finalement, sachez qu’avec les DTD, vous ne pourrez pas toujours tout faire, la technologie commençant en effet à vieillir. Mais comme elle est encore beaucoup utilisée, il est indispensable qu’elle soit étudiée dans ce tutoriel.

Où écrire les DTD ?

Tout comme les fichiers XML, les DTD s’écrivent dans des fichiers.

Nous reviendrons sur ce point un peu plus tard, mais sachez dès à présent qu’il existe 2 types de DTD : les DTD externes et les DTD internes.

Les règles des DTD internes s’écrivent directement dans le fichier XML qu’elles définissent tandis que les règles des DTD externes sont écrites dans un fichier séparé portant l’extension .dtd.

Maintenant que vous en savez un peu plus, je vous propose de rentrer dans le vif du sujet.

Les éléments

La syntaxe

Pour définir les règles portant sur les balises, on utilise le mot clef ELEMENT.

<!ELEMENT balise (contenu)>

Une règle peut donc se découper en 3 mots clefs : ELEMENT, balise et contenu.

Retour sur la balise

Le mot-clef balise est à remplacer par le nom de la balise à laquelle vous souhaitez appliquer la règle.

Par exemple, reprenons une balise du TP de la partie 1 :

<nom>DOE</nom>

On écrira alors :

<!ELEMENT nom (contenu)>

Retour sur le contenu

Cet emplacement a pour vocation de décrire ce que doit contenir la balise : est-ce une autre balise ou est-ce une valeur ?

Cas d’une balise en contenant une autre

Par exemple, regardons la règle suivante :

<!ELEMENT personne (nom)>
<!-- suite de la DTD -->

Cette règle signifie que la balise <personne /> contient la balise <nom />.

Le document XML respectant cette règle ressemble donc à cela :

<personne>
  <nom>John DOE</nom>
</personne>

Cas d’une balise contenant une valeur

Dans le cas où notre balise contient une valeur simple, on utilisera la mot clef #PCDATA.

Une valeur simple désigne par exemple une chaîne de caractères, un entier, un nombre décimal, un caractère, etc.

En se basant sur l’exemple précédent :

<personne>
  <nom>John DOE</nom>
</personne>

nous avions déjà défini une règle pour la balise <personne/>:

<!ELEMENT personne (nom)>

Nous pouvons maintenant compléter notre DTD en ajoutant une règle pour la balise <nom/>. Par exemple, si l’on souhaite que cette balise contienne une valeur simple, on écrira :

<!ELEMENT nom (#PCDATA)>

Au final, la DTD de notre document XML est donc la suivante :

<!ELEMENT personne (nom)>
<!ELEMENT nom (#PCDATA)>

Cas d’une balise vide

Il est également possible d’indiquer qu’une balise ne contient rien grâce au mot-clef EMPTY.

Prenons les règles suivantes :

<!ELEMENT personne (nom)>
<!ELEMENT nom EMPTY>

Le document XML répondant à la définition DTD précédente est le suivant :

<personne>
  <nom></nom>
</personne>

Cas d’une balise pouvant tout contenir

Il nous reste un cas à voir : celui d’une balise qui peut tout contenir, c’est à dire, une autre balise, une valeur simple ou tout simplement être vide. Dans ce cas, on utilise le mot-clef ANY.

Prenons la règle suivante :

<!ELEMENT personne (nom)>
<!ELEMENT nom ANY>

Les documents XML suivants sont bien valides :

<!-- valeur simple -->
<personne>
  <nom>John DOE</nom>
</personne>

<!-- vide -->
<personne>
  <nom />
</personne>

Structurer le contenu des balises

Nous allons voir maintenant des syntaxes permettant d’apporter un peu de généricité aux définitions DTD.

Par exemple, un répertoire contient généralement un nombre variable de personnes, il faut donc permettre au document XML d’être valide quel que soit le nombre de personnes qu’il contient.

La séquence

Une séquence permet de décrire l’enchaînement imposé des balises. Il suffit d’indiquer le nom des balises en les séparant par des virgules.

<!ELEMENT balise (balise2, balise3, balise4, balise5, etc.)>

Prenons l’exemple suivant :

<!ELEMENT personne (nom, prenom, age)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT age (#PCDATA)>

Cette définition impose que la balise <personne /> contienne obligatoirement les balises <nom />, <prenom /> et <age /> dans cet ordre.

Regardons alors la validité des documents XML qui suivent :

<!-- valide -->
<personne>
  <nom>DOE</nom>
  <prenom>John</prenom>
  <age>24</age>
</personne>

<!-- invalide -->
<!-- les balises ne sont pas dans le bon ordre -->
<personne>
  <prenom>John</prenom>
  <nom>DOE</nom>
  <age>24</age>
</personne>

<!-- invalide -->
<!-- il manque une balise -->
<personne>
  <prenom>John</prenom>
  <age>24</age>
</personne>

<!-- invalide -->
<!-- il y a une balise en trop, qui plus est non déclarée -->
<personne>
  <nom>DOE</nom>
  <prenom>John</prenom>
  <age>24</age>
  <date>12/12/2012</date>
</personne>

La liste de choix

Une liste de choix permet de dire qu’une balise contient l’une des balises décrites. Il suffit d’indiquer le nom des balises en les séparant par une barre verticale.

<!ELEMENT balise (balise2 | balise3 | balise4 | balise5 | etc.)>

Prenons l’exemple suivant :

<!ELEMENT personne (nom | prenom)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>

Cette définition impose que la balise <personne /> contienne obligatoirement la balise <nom /> ou la balise <prenom />.

Regardons alors la validité des documents XML ci-dessous :

<!-- valide -->
<personne>
  <nom>DOE</nom>
</personne>

<!-- valide -->
<personne>
  <prenom>John</prenom>
</personne>

<!-- invalide -->
<!-- les 2 balises prenom et nom ne peuvent pas être présentes en même temps. -->
<personne>
  <prenom>John</prenom>
  <nom>DOE</nom>
</personne>

<!-- invalide -->
<!-- il manque une balise -->
<personne />

La balise optionnelle

Une balise peut être optionnelle. Pour indiquer qu’une balise est optionnelle, on fait suivre son nom par un point d’interrogation.

<!ELEMENT balise (balise2, balise3?, balise4)>

Prenons l’exemple suivant :

<!ELEMENT personne (nom, prenom?)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>

Cette définition impose que la balise <personne /> contienne obligatoirement la balise <nom /> puis éventuellement <prenom />.

Regardons alors la validité de ces documents XML :

<!-- valide -->
<personne>
  <nom>DOE</nom>
</personne>

<!-- valide -->
<personne>
  <nom>DOE</nom>
  <prenom>John</prenom>
</personne>

<!-- invalide -->
<!-- l'ordre des balises n'est pas respecté -->
<personne>
  <prenom>John</prenom>
  <nom>DOE</nom>
</personne>

La balise répétée optionnelle

Une balise peut être répétée plusieurs fois même si elle est optionnelle. Pour indiquer une telle balise, on fait suivre son nom par une étoile.

<!ELEMENT balise (balise2, balise3*, balise4)>

Soit l’ensemble de règles suivant :

<!ELEMENT repertoire (personne*)>
<!ELEMENT personne (nom, prenom)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>

Cette définition impose que la balise <repertoire /> contienne entre 0 et une infinité de fois la balise <personne />. La balise <personne />, quant à elle, doit obligatoirement contenir les balises <nom /> et <prenom /> dans cet ordre.

Regardons alors la validité des documents XML :

<!-- valide -->
<repertoire>
  <personne>
    <nom>DOE</nom>
    <prenom>John</prenom>
  </personne>
  <personne>
    <nom>POPPINS</nom>
    <prenom>Marie</prenom>
  </personne>
</repertoire>

<!-- valide -->
<repertoire>
  <personne>
    <nom>DOE</nom>
    <prenom>John</prenom>
  </personne>
</repertoire>

<!-- valide -->
<repertoire />

<!-- invalide -->
<!-- il manque la balise  prenom dans la seconde balise personne-->
<repertoire>
  <personne>
    <nom>DOE</nom>
    <prenom>John</prenom>
  </personne>
  <personne>
    <nom>POPPINS</nom>
  </personne>
</repertoire>

La balise répétée

Une balise peut être répétée plusieurs fois. Pour indiquer une telle balise, on fait suivre son nom par un plus.

<!ELEMENT balise (balise2, balise3+, balise4)>

Prenons l’exemple suivant :

<!ELEMENT repertoire (personne+)>
<!ELEMENT personne (nom, prenom)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>

Cette définition impose que la balise <repertoire /> contienne au minimum une fois la balise <personne />. La balise <personne /> quant à elle doit obligatoirement contenir les balises <nom /> et <prenom /> dans cet ordre.

Regardons alors la validité des documents XML suivants :

<!-- valide -->
<repertoire>
  <personne>
    <nom>DOE</nom>
    <prenom>John</prenom>
  </personne>
  <personne>
    <nom>POPPINS</nom>
    <prenom>Marie</prenom>
  </personne>
</repertoire>

<!-- valide -->
<repertoire>
  <personne>
    <nom>DOE</nom>
    <prenom>John</prenom>
  </personne>
</repertoire>

<!-- invalide -->
<!-- la balise personne doit être présente au moins une fois-->
<repertoire />

En résumé

  • Un document valide est un document bien formé conforme à une définition.
  • Un document conforme à une définition est un document qui respecte toutes les règles qui lui sont imposées dans les fameuses définitions.
  • Il existe les DTD internes et les DTD externes.
  • Il est possible d’écrire de nombreuses règles grâce aux DTD.
  • Le mot clef ELEMENT permet d’écrire les règles relatives aux balises XML.

Ce cours vous plait ?

Retrouvez ce cours en livre physique sur Amazon !