XML : DTD (Document Type Definition)

Construction d'une DTD

Le DTD (Data Type Definition) sert à "formaliser" la structure d'un document XML. En d'autre mot : faire la police !

Le DTD peut se placer avant le contenu du fichier XML, juste après la ligne d'en-tête, comme ceci : admettons que les données XML soient contenues dans la balise principale Ouvrage, et qu'il y ait une seule sous-balise : Titre.

<?xml version="1.0" ?>

<!DOCTYPE Ouvrage
  [
  <!ELEMENT Ouvrage (Titre)  >
  <!ELEMENT Titre   (#PCDATA)>
  ]>

<Ouvrage>
  <Titre>
    La vie des animaux
  </Titre>
</Ouvrage>

Placement d'une DTD dans un fichier externe

Il est possible de placer cette DTD dans un fichier externe pour l'évidente raison d'avoir plusieurs fichiers XML qui se réfèrent à la même DTD. La syntaxe est la suivante :

(Il est nécessaire de préciser que le fichier XML ne se suffit plus à lui-même avec le paramètre de ligne d'en-tête : standalone="no". Si on le met à "yes", il n'y a pas d'erreur, mais le fichier externe DTD sera ignoré.)

Fichier Test.xml :

<?xml version="1.0" standalone="no"?>
<!DOCTYPE Ouvrage SYSTEM "Ouvrage.dtd">
<Ouvrage>
<Titre> La vie des animaux</Titre>
</Ouvrage>

Fichier Ouvrage.dtd :

<!ELEMENT Ouvrage (Titre)>
<!ELEMENT Titre (#PCDATA)>

(PCDATA = Parsed Character DATA)

S'il y a un paramètre à une balise, telle que le paramètre Auteur à Ouvrage :

Fichier Test.xml :

<?xml version="1.0" standalone="no"?>
<!DOCTYPE Ouvrage SYSTEM "Ouvrage.dtd">

<Ouvrage Auteur="Defawes">
<Titre> La vie des animaux</Titre>
</Ouvrage>

Fichier Ouvrage.dtd :

<!ELEMENT Ouvrage (Titre)>
<!ATTLIST Ouvrage Auteur CDATA #REQUIRED>
<!ELEMENT Titre (#PCDATA)>

Plusieurs balises différentes

Admettons que nous avons besoin du Titre, mais en plus du Prix :

Fichier Test.xml :

<?xml version="1.0" standalone="no"?>
<!DOCTYPE Ouvrage SYSTEM "Ouvrage.dtd">
<Ouvrage Auteur="Defawes">
  <Titre> La vie des animaux</Titre>

  <Prix>25.90</Prix>
</Ouvrage>

Fichier Ouvrage.dtd :

<!ELEMENT Ouvrage (Titre, Prix)>
<!ATTLIST Ouvrage Auteur CDATA #REQUIRED>
<!ELEMENT Titre (#PCDATA)>
<!ELEMENT Prix (#PCDATA)>

Plusieurs fois la même balise

Un ouvrage est constitué de plusieurs chapitres. Comment déclarer ça dans la DTD ? En ajoutant le signe + à côté de la balise :

Fichier Test.xml :

<?xml version="1.0" standalone="no"?>
<!DOCTYPE Ouvrage SYSTEM "Ouvrage.dtd">
<Ouvrage Auteur="Defawes">
<Titre> La vie des animaux</Titre>
<Prix>25.90</Prix>

<Chapitre>Les chats</Chapitre>
<Chapitre>Les poissons</Chapitre>

</Ouvrage>

Fichier Ouvrage.dtd :

<!ELEMENT Ouvrage (Titre, Prix, Chapitre+)>
<!ATTLIST Ouvrage Auteur CDATA #REQUIRED>
<!ELEMENT Titre (#PCDATA)>
<!ELEMENT Prix (#PCDATA)>
<!ELEMENT Chapitre (#PCDATA)>