Motivations
Nous avons vu comment il était possible d'écrire du XML en respectant ses règles de syntaxe et d'obtenir ainsi un document XML bien formé.
Nous allons maintenant décrire comment spécifier des contraintes plus précises et propres à notre langage XML. Cela va prendre ici la forme d'une DTD (Définition de Type de Document).
On dira alors qu'en plus d'être bien formé, le document est valide par rapport à une certaine DTD.
Cette spécification d'une grammaire pour un langage et la possibilité de tester automatiquement son respect par un document donné, présentent les avantages suivants :
- faciliter l'échange et la mise en commun de documents produits par des rédacteurs différents ;
- aider les développeurs qui conçoivent des outils automatiques pour traiter les documents respectant la même DTD.
Lier un fichier XML à une DTD
DTD interne
Dans ce cas, la spécification de la DTD arrive dans l'entête du document XML : on trouve d'abord le mot-clef DOCTYPE suivi de l'élément servant de racine au document et enfin la DTD elle-même entre crochets :
.
.
.
]>
.
.
.
DTD externe
Cette fois, la DTD est détachée dans un fichier séparé, on se contente d'y faire référence dans l'entête du document XML. On retrouve le mot-clef DOCTYPE suivi de l'élément servant de racine, puis le mot-clef SYSTEM suivi d'une URI menant au fichier DTD.
À noter également que la première ligne doit faire apparaître l'attribut standalone avec la valeur no.
.
.
.
À noter que, sans toucher au document XML, il est possible de faire le lien au moment de la validation. Par exemple, avec xmllint, on écrira :
xmllint --dtdvalid madtd.dtd mondoc.xml --noout
DTD mixte
Enfin, il est possible de mélanger les deux notations pour avoir une partie de la DTD dans un fichier séparé et une autre partie embarquée dans le document XML :
.
.
.
]>
.
.
.
- Motivations
- Lier un fichier XML à une DTD
- Définir les éléments et leurs contenus
- Définir les attributs
- Définir les entités
- DTD modulaires
- Bilan sur les DTD
Définir les éléments et leurs contenus
Il s'agit ici de déclarer les éléments autorisés à apparaître dans le document, ainsi que leurs imbrications possibles. La forme générale est la suivante :
Les noms des éléments (comme ceux des attributs) doivent être des noms XML :
- le premier caractère est une lettre quelconque ou un _ (underscore ou tiret bas) ;
- les caractères suivants peuvent être des lettres, des chiffres, des tirets bas (_), des traits d'union (-) ou des points (.) ;
- il n'y a pas de limitation sur la longueur d'un nom XML.
Nous passons maintenant en revue les différents modèles de contenu utilisables dans les DTD.
Contenu purement textuel
Si l'élément peut contenir du texte brut mais pas de nouvelles balises, on utilisera le modèle de contenu PCDATA :
Aucune balise n'est donc tolérée dans ce type de contenu mais, par contre, il est possible d'y utiliser des entités.
Sous-éléments
Ici, on va lister les sous-éléments pouvant apparaître dans le contenu, par exemple :
indique que l'élément identité doit contenir, dans l'ordre, un élément prénom, un élément nom, et rien d'autre.
Il est possible de moduler le nombre d'apparitions d'un sous-élément en utilisant des quantifieurs après les noms d'éléments. Les quantifieurs utilisables dans les DTD sont :
- ? : 0 ou 1 fois ;
- * : 0, 1 ou plus ;
- + : 1 ou plus.
L'exemple suivant indique que l'élément identité doit contenir, toujours en respectant l'ordre, un ou plusieurs éléments prénom, un élément surnom facultatif et exactement un élément nom :
Alternatives
Il est également possible de définir les sous-éléments qui peuvent apparaître de manière exclusive : si c'est l'un, ça n'est pas les autres. Dans l'exemple ci-dessous, une expérience professionnelle peut être soit un emploi, soit un stage :
Modifiez-moi !