Qu’est-ce qu’un fichier DTD et comment en écrire un ?
Apprenez à rédiger un fichier de validation pour vos fichiers XML.
Article publié le 19/08/2024, dernière mise à jour le 19/08/2024
Pour comprendre l’article qui suit, vous devez être familier avec le format XML. Si ce n’est pas le cas, il est recommandé de lire cet article en amont.
Un fichier DTD (pour “Document Type Definition”) est, comme son nom l’indique, un document dans lequel est précisément décrite la structure de données à suivre pour que le contenu d’un document XML soit valide.
Petit point sémantique, on parle d’un document XML :
- “bien formé” quand il respecte la syntaxe du langage
- “valide” lorsque le contenu respecte le schéma fourni dans le DTD
Un exemple de DTD
Voici un exemple de document DTD simplifié, mais contenant plusieurs variations pour avoir un schéma complet :
<!ELEMENT school (course*)>
<!ELEMENT course (title, description, teacher)>
<!ELEMENT teacher EMPTY>
<!ATTLIST teacher name PCDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT description (#PCDATA)>
Et voici un exemple de données XML valides par rapport au schéma précédent :
<school>
<course>
<teacher name="John Doe />
<title>Learn JavaScript 101</title>
<description>...</description>
</course>
</school>
Ajouter un schéma à un fichier XML
Pour que le contenu d’un fichier XML puisse être validé par un fichier DTD, il faut qu’une balise <!DOCTYPE>
soit présente dans le document, juste en dessous de l’en-tête, comme ceci :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example SYSTEM "example.dtd">
Avoir un schéma DTD est bien sur optionnel, la structure d’un fichier XML peut être laissée complètement libre (à part le respect de la syntaxe du langage).
Voyons maintenant quel genre d’informations contient notre fameux fichier DTD.
La syntaxe d’un DTD
Définir un élément
Pour définir un nouvel élément valide, nous avons besoin de trois choses :
- La déclaration
<!ELEMENT ... >
- Un nom d’élément
- La liste des éléments enfants (hiérarchie)
Exemple :
<!ELEMENT course (title, description, teacher)>
On sera que notre élément course
devra contenir un titre, une description et un professeur. Il suffit alors de déclarer nos éléments enfant, et leur propre hiérarchie pour avoir un schéma complet !
Définir la hiérarchie et la multiplicité
Lorsque l’on défini la liste des éléments enfant d’un élément parent, plusieurs possibilité s’offre à nous. Prenons l’exemple de notre école :
Un enfant unique
<!ELEMENT school (course)>
Ici, on indique qu’une école va devoir contenir un seul et unique cours.
Un enfant optionnel
<!ELEMENT school (course?)>
Grâce à l’opérateur ?
, on indique que notre école pourra avoir entre 0 et 1 cours.
Plusieurs enfants (sans minimum)
<!ELEMENT school (course*)>
L’opérateur *
est l’équivalent d’une liste, une école pourra avoir un nombre illimité de cours.
Plusieurs enfants (au minimum 1)
<!ELEMENT school (course+)>
Avec +
, on retrouve la possibilité d’avoir une liste, mais qui devra contenir au minimum un enfant.
Les valeurs primitives
En XML, il n’y a qu’une sorte de valeur primitive : le texte.
Mais il y a deux types pour déclarer une valeur textuelle :
#PCDATA
pour du texte où les caractères spéciaux (<
,>
,&
) seront interprétés comme étant du XML#CDATA
pour du texte brut
Dans notre exemple, le titre d’un cours sera simplement du texte, donc l’élément est déclaré comme ceci :
<!ELEMENT title (#PCDATA)>
Un élément vide
Il est également possible de déclarer un élément qui ne possèdera aucun élément enfant, on parle d’élément “vide” :
<!ELEMENT teacher EMPTY>
Définir un élément vide va nous permettre de stocker toutes les données de l’élément directement dans des attributs.
Définir les attributs
Pour ajouter des attributs à un élément il suffit de déclarer une liste d’attribut liée à notre élément de base, puis à remplir cette liste :
<!ELEMENT teacher EMPTY>
<!ATTLIST teacher firstname PCDATA #REQUIRED>
<!ATTLIST teacher lastname PCDATA #REQUIRED>
<!ATTLIST teacher age PCDATA #REQUIRED>
Retrouvez tous les types et les options des attributs dans la documentation : https://www.w3schools.com/xml/xml_dtd_attributes.asp
À noter
Le DTD peut être inséré directement dans le fichier XML qu’il valide.
On parle alors d’un DTD “inline”, comme ci-dessous :
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
Cette méthode possède deux inconvénients majeurs :
- Cela alourdi votre fichier XML
- Le DTD ne peut pas être réutilisé pour valider un autre fichier
Aucun commentaire pour l'instant