Link Search Menu Expand Document

DTD - où les écrire ?

Au cours des derniers chapitres, nous avons étudié tout ce qu’il faut savoir ou presque sur les DTD. Il vous reste cependant encore une chose à apprendre avant que vous puissiez être indépendant et passer à la pratique : où écrire les DTD ?

Ce dernier chapitre avant un TP sera également l’occasion de vous révéler qu’il existe en réalité plusieurs sortes de DTD.

Les DTD internes

Comme je vous l’ai déjà précisé dans le premier chapitre de cette seconde partie, on distingue 2 types de DTD : les internes et les externes.

Commençons par étudier les DTD internes.

Définition

Une DTD interne est une DTD qui est écrite dans le même fichier que le document XML. Elle est généralement spécifique au document XML dans lequel elle est écrite.

La syntaxe

Une DTD interne s’écrit dans ce qu’on appelle le DOCTYPE. On le place sous le prologue du document et au dessus du contenu XML.

Voyons plus précisément la syntaxe :

<!DOCTYPE racine [ ]>

La DTD interne est ensuite écrite entre les []. Dans ce DOCTYPE, le mot racine doit être remplacé par le nom de la balise qui forme la racine du document XML.

Illustrons avec un exemple

Afin que tout cela vous paraisse moins abstrait, je vous propose de voir un exemple.

Prenons l’énoncé suivant :

Une boutique possède plusieurs téléphones. Chaque téléphone est d’une certaine marque et d’un certain modèle représenté par une chaîne de caractères.

Un document XML répondant à cet énoncé peut être le suivant :

<?xml version = "1.0" encoding="UTF-8" standalone="yes" ?>

<boutique>
  <telephone>
    <marque>Samsung</marque>
    <modele>Galaxy S3</modele>
  </telephone>

  <telephone>
    <marque>Apple</marque>
    <modele>iPhone 4</modele>
  </telephone>

  <telephone>
    <marque>Nokia</marque>
    <modele>Lumia 800</modele>
  </telephone>
</boutique>

La définition DTD est la suivante :

<!ELEMENT boutique (telephone*)>
<!ELEMENT telephone (marque, modele)>
<!ELEMENT marque (#PCDATA)>
<!ELEMENT modele (#PCDATA)>

Le document XML complet avec la DTD interne sera par conséquent le suivant :

<?xml version = "1.0" encoding="UTF-8" standalone="yes" ?>

<!DOCTYPE boutique [
  <!ELEMENT boutique (telephone*)>
  <!ELEMENT telephone (marque, modele)>
  <!ELEMENT marque (#PCDATA)>
  <!ELEMENT modele (#PCDATA)>
]>

<boutique>
  <telephone>
    <marque>Samsung</marque>
    <modele>Galaxy S3</modele>
  </telephone>

  <telephone>
    <marque>Apple</marque>
    <modele>iPhone 4</modele>
  </telephone>

  <telephone>
    <marque>Nokia</marque>
    <modele>Lumia 800</modele>
  </telephone>
</boutique>

Maintenant que vous savez ce qu’est une DTD interne, passons sans plus attendre à la DTD externe !

Les DTD externes

Définition

Une DTD externe est une DTD qui est écrite dans un autre document que le document XML. Si elle est écrite dans un autre document, c’est que souvent, elle est commune à plusieurs documents XML qui l’exploitent.

De manière générale, afin de bien séparer le contenu XML de sa définition DTD, on prendra l’habitude de créer plusieurs fichiers afin de les séparer.

Un fichier contenant uniquement une DTD porte l’extension .dtd.

La syntaxe

L’étude de la syntaxe d’une DTD externe est l’occasion de vous révéler qu’il existe en réalité 2 types de DTD : les DTD externes PUBLIC et les DTD externes SYSTEM.

Dans les 2 cas et comme pour une DTD interne, c’est dans le DOCTYPE que cela se passe.

Les DTD externes PUBLIC

Les DTD externes PUBLIC sont généralement utilisées lorsque la DTD est une norme. C’est par exemple le cas dans les documents xHTML 1.0.

La syntaxe est la suivante :

<!DOCTYPE racine PUBLIC "identifiant" "url">

Si on l’applique à un document xHTML, on obtient alors le DOCTYPE suivant :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Pour être honnête, nous n’allons jamais utiliser les DTD externes PUBLIC dans ce tutoriel, c’est pourquoi je vous propose de passer immédiatement aux DTD externes SYSTEM.

Les DTD externes SYSTEM

Une DTD externe SYSTEM permet d’indiquer au document XML l’adresse du document DTD. Cette adresse peut-être relative ou absolue.

Voyons plus précisément la syntaxe :

<!DOCTYPE racine SYSTEM "URI">

Afin d’illustrer mes propos, je vous propose de reprendre l’exemple de la boutique de téléphone que j’ai utilisé dans la partie sur la DTD interne.

Voici un rappel de l’énoncé :

Une boutique possède plusieurs téléphones. Chaque téléphone est d’une certaine marque et d’un certain modèle, tous les 2 représentés par une chaîne de caractères.

Pour rappel, voici le fichier XML :

<?xml version = "1.0" encoding="UTF-8" standalone="yes" ?>

<boutique>
  <telephone>
    <marque>Samsung</marque>
    <modele>Galaxy S3</modele>
  </telephone>

  <telephone>
    <marque>Apple</marque>
    <modele>iPhone 4</modele>
  </telephone>

  <telephone>
    <marque>Nokia</marque>
    <modele>Lumia 800</modele>
  </telephone>
</boutique>

Si la DTD ne change pas, elle doit cependant être placée dans un fichier à part, par exemple le fichier doc1.dtd. Voici son contenu :

<!ELEMENT boutique (telephone*)>
<!ELEMENT telephone (marque, modele)>
<!ELEMENT marque (#PCDATA)>
<!ELEMENT modele (#PCDATA)>

Le document XML complet avec la DTD externe sera alors le suivant (on part ici du principe que le fichier XML et DTD sont stockés au même endroit) :

<?xml version = "1.0" encoding="UTF-8" standalone="yes" ?>

<!DOCTYPE boutique SYSTEM "doc1.dtd">

<boutique>
  <telephone>
    <marque>Samsung</marque>
    <modele>Galaxy S3</modele>
  </telephone>

  <telephone>
    <marque>Apple</marque>
    <modele>iPhone 4</modele>
  </telephone>

  <telephone>
    <marque>Nokia</marque>
    <modele>Lumia 800</modele>
  </telephone>
</boutique>

Retour sur le prologue

Dans la partie précédente de ce tutoriel, voici ce que je vous avais dit à propos du fait que nos documents XML soient autonomes ou non :

La dernière information présente dans le prologue est standalone="yes".

Cette information permet de savoir si votre document XML est autonome ou si un autre document lui est rattaché.

Il est encore un peu tôt pour vous en dire plus. Nous reviendrons sur cette notion dans la partie 2 du tutoriel. Pour le moment, acceptez le fait que nos documents sont tous autonomes.

Il est maintenant temps de lever le mystère !

Dans le cas d’une DTD externe, nos documents XML ne sont plus autonomes, en effet, ils font référence à un autre fichier qui fournit la DTD. Afin que le document contenant la DTD soit bien pris en compte, nous devons l’indiquer en passant simplement la valeur de l’attribut standalone à “no”.

Voici ce que cela donne :

<?xml version = "1.0" encoding="UTF-8" standalone="no" ?>

<!DOCTYPE boutique SYSTEM "doc1.dtd">

<boutique>
  <telephone>
    <marque>Samsung</marque>
    <modele>Galaxy S3</modele>
  </telephone>

  <telephone>
    <marque>Apple</marque>
    <modele>iPhone 4</modele>
  </telephone>

  <telephone>
    <marque>Nokia</marque>
    <modele>Lumia 800</modele>
  </telephone>
</boutique>

Un exemple avec EditiX

Pour clore ce chapitre, je vous propose de voir ensemble comment écrire une DTD externe SYSTEM avec EditiX.

Pour faire simple, je vous propose de garder l’exemple précédent de la boutique de téléphone.

Création du document XML

La création du document XML n’a rien de bien compliqué puisque nous l’avons déjà vu ensemble dans la partie précédente.

Pour ceux qui ne s’en souviennent pas, vous pouvez y jeter un coup d’œil ici.

Voici le document que vous devez écrire :

<?xml version = "1.0" encoding="UTF-8" standalone="no" ?>

<!DOCTYPE boutique SYSTEM "boutique.dtd">

<boutique>
  <telephone>
    <marque>Samsung</marque>
    <modele>Galaxy S3</modele>
  </telephone>

  <telephone>
    <marque>Apple</marque>
    <modele>iPhone 4</modele>
  </telephone>

  <telephone>
    <marque>Nokia</marque>
    <modele>Lumia 800</modele>
  </telephone>
</boutique>

Si vous essayez de lancer la vérification du document, vous devriez normalement obtenir un message d’erreur, comme celui indiqué à la figure suivante :

Message d'erreur indiquant que le document DTD est introuvable

Ce message est, pour le moment, complètement normal puisque nous n’avons pas encore créé notre document DTD.

Création du document DTD

Pour créer un nouveau document, vous pouvez cliquer sur l’icône

Création d'un document XML

sélectionner dans la barre de menu File puis New ou encore utiliser le raccourci clavier Ctrl + N.

Dans la liste qui s’affiche, sélectionnez DTD :

Création d'un document DTD

Votre document DTD n’est normalement pas vierge. Voici ce que vous devriez avoir :

<!-- DTD created at Wed Sep 12 14:49:47 CEST 2012 with EditiX. Please insert an encoding attribute header for converting any DTD  -->

<!ELEMENT  tag (#PCDATA)>
<!ATTLIST tag  attribute CDATA #REQUIRED>

Replacez le contenu par notre véritable DTD :

<!ELEMENT boutique (telephone*)>
<!ELEMENT telephone (marque, modele)>
<!ELEMENT marque (#PCDATA)>
<!ELEMENT modele (#PCDATA)>

Enregistrez ensuite votre document avec le nom boutique.dtd au même endroit que votre document XML.

Vérification de la DTD

Vous pouvez vérifier que votre DTD n’a pas d’erreur de syntaxe en cliquant sur l’icône

Icône editix check document

ou bien en sélectionnant dans la barre de menu DTD/Schema puis Check this DTD ou encore en utilisant le raccourci clavier Ctrl + K.

Vous devriez normalement avoir un message d’information de ce type :

Message indiquant que le document DTD est correcte

Vérification du document XML

Il est maintenant temps de vérifier que le document XML est valide !

Pour ce faire, sélectionnez dans la barre de menu XML puis Check this document ou encore en utilisant le raccourci clavier Ctrl + K.

Le message suivant doit normalement s’afficher :

Message indiquant que le document XML est valide

En résumé

  • Les DTD internes s’écrivent dans le document XML.
  • Les DTD externes s’écrivent dans un fichier différent de celui du document XML dont l’extension est .dtd.
  • EditiX permet en quelque cliques de vérifier qu’un document DTD est correct et qu’un document XML est valide.

Ce cours vous plait ?

Retrouvez ce cours en livre physique sur Amazon !