COURS
DTD
PLAN DU COURS
• L’objectif de DTD
• Lier XML à une DTD
• Définir les éléments et leurs contenus
• Contenu purement texte
• Sous-éléments
• Alternatives
• Combinaisons
• Contenu mixte
• Contenu vide
• Contenu quelconque
• Définir les attributs
• Définir les Entités
INTRODUCTION
Application « A » Application « B »
<XML> <XML>
<produit id=‘123’> <product>
<name>shoes</name> <ID> 123</ID>
<produit> <name>shoes</name>
<product>
INTRODUCTION
Création d’un DTD c’est-à-dire de construire un ensemble
de règles qui vont régir la construction du document XML
DTD permet de :
• Définir l’architecture de document XML;
• Définir la hiérarchie qui existe entre les balises de
document XML
• Préciser l’enchainement et le contenu des balises et des
attributs;
INTRODUCTION
Faciliter l’échange de données.
Faciliter la mise en commun de document
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 XML À UNE DTD
Une DTD peut être interne, externe ou mixte au document
XML.
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 INTERNE
Exemple 1 : déclaration de DTD interne
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cv [
]>
<cv>
</cv>
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.
DTD EXTERNE
Exemple 2 : déclaration de DTD externe
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE cv SYSTEM "[Link]">
<cv>
</cv>
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 :
DTD EXTERNE
Exemple 3 : déclaration de DTD mixte
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE cv SYSTEM "[Link]" [
]>
<cv>
</cv>
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 :
<!ELEMENT nom_element modèle_de_contenu>
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
• 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 :
<!ELEMENT téléphone (#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.
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Sous-éléments
Ici, on va lister les sous-éléments pouvant apparaître
dans le contenu, par exemple :
<!ELEMENT identité (prénom,nom)>
indique que l'élément identité doit contenir, dans l'ordre,
un élément prénom, un élément nom, et rien d'autre.
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
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 :
<!ELEMENT identité (prénom+,surnom?,nom)>
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
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 :
<!ELEMENT expérience (stage | emploi)>
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Combinaisons
Enfin, il est possible de combiner les syntaxes vues
précédemment :
<!ELEMENT participant ((association,adresse) | (groupe,membre*)+ )>
Dans ce cas, un participant est :
• soit une association ayant une adresse ;
• soit une suite de groupe, chaque groupe ayant plusieurs membres.
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Contenu mixte
Une possibilité intéressante est de pouvoir mixer du texte brut avec
des balises sans mettre plus de contraintes sur l'ordre et le nombre
d'apparitions de ces balises. Cela se fait avec une alternative entre un
contenu de type PCDATA et des sous-éléments, cette alternative
pouvant se répéter plusieurs fois :
<!ELEMENT parcours (#PCDATA | diplôme)*>
Ici, on a un élément parcours qui a un contenu mixte : du texte
pouvant contenir un nombre quelconque de sous-éléments diplôme.
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Contenu vide
Un élément peut également n'avoir aucun contenu, comme c'est le
cas par exemple de la balise br (retour à la ligne en HTML). Cela se
précise dans la DTD de la manière suivante :
<!ELEMENT br EMPTY>
Une telle balise sera donc ouverte et immédiatement refermée avec
la notation suivante : <br />.
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Contenu quelconque
On termine avec la possibilité d'autoriser n'importe quel contenu à
apparaître dans un élément.
<!ELEMENT mavie ANY>
Dans ce cas, l'élément mavie pourra contenir du texte brut mélangé
avec toute balise définie dans la DTD, dans n'importe quel ordre, autant
de fois que l'on veut.
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Un exemple simple et complet
Une DTD que l'on enregistre dans un fichier nommé [Link] :
<!ELEMENT liste_livres (livre+)>
<!ELEMENT livre (titre,auteur+,éditeur,description?,prix)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT éditeur (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT prix (#PCDATA)>
DÉFINIR LES ÉLÉMENTS ET LEURS CONTENUS
Un exemple simple et complet
et un fichier XML la respectant :
DÉFINIR LES ATTRIBUTS
La syntaxe des DTD utilise cette fois le mot ATTLIST,
suivi du nom de l'élément concerné, suivi de la liste de ses
attributs : pour chacun, on trouvera son nom, son type et
son caractère optionnel ou non.
Comme nous l'avons déjà indiqué, les noms des attributs
doivent être des noms XML.
DÉFINIR LES ATTRIBUTS
Une déclaration d'attributs typique aura la forme suivante :
<!ATTLIST identité
prénom CDATA #REQUIRED
nom CDATA #REQUIRED
surnom CDATA #IMPLIED>
Dans ce cas, l'élément identité possède trois
attributs prénom, nom et surnom. Les deux premiers sont obligatoires
(REQUIRED) et le dernier est optionnel (IMPLIED).
À noter également la possibilité pour un attribut d'être FIXED, c'est-
à-dire de prendre systématiquement la même valeur.
DÉFINIR LES ATTRIBUTS
Les différents types d'attributs.
CDATA
C'est le type le plus général, il permet de saisir un texte quelconque
pour un attribut de ce type. Il est même possible d'utiliser ici les
caractères habituellement réservés à XML : <, > et &.
NMTOKEN
Il s'agit ici un nom XML mais sans restriction sur le premier caractère
(qui peut donc être un chiffre).
Par exemple, un code postal pourra être déclaré de ce type :
<!ATTLIST ville nom CDATA #REQUIRED
code NMTOKEN #REQUIRED>
DÉFINIR LES ATTRIBUTS
Les différents types d'attributs.
énumération
Dans ce cas, l'attribut ne peut prendre qu'un nombre fini de valeurs
et l'on en donne la liste exhaustive, ces valeurs étant séparées par
des |.
<!ATTLIST date jour
(lundi | mardi | mercredi | jeudi | vendredi | samedi |
dimanche) #REQUIRED
num NMTOKEN #REQUIRED
mois NMTOKEN #REQUIRED
année NMTOKEN #REQUIRED>
DÉFINIR LES ATTRIBUTS
Les différents types d'attributs.
ID
Il doit s'agir d'un nom XML qui identifie de manière unique l'élément.
Autrement dit, une valeur qui apparaît dans un tel attribut ne peut pas
apparaître une seconde fois dans le même document.
<!ATTLIST diplôme
intitulé CDATA #REQUIRED
codeDiplôme ID #REQUIRED>
DÉFINIR LES ATTRIBUTS
Les différents types d'attributs.
IDREF
Un attribut de type IDREF doit contenir une valeur utilisée
comme ID ailleurs dans le document. Cela permet souvent de ne pas
écrire 100 fois les mêmes informations.
Par exemple, votre document XML peut vous servir à représenter des
liens de parenté entre des personnes. Grâce aux références, nous
n'allons pas devoir imbriquer des balises XML dans tous les sens pour
tenter de représenter le père d'une personne ou le fils d'une personne.
DÉFINIR LES ATTRIBUTS
Les différents types d'attributs.
IDREF
Prenons par exemple la règle suivante :
<!ATTLIST father id ID #REQUIRED>
<!ATTLIST child id ID #REQUIRED
father IDREF #REQUIRED>
Cette règle signifie que la balise child a 2 attributs : id qui est l'identifiant
unique de la personne et father qui fait référence une autre personne.
<father id="PER-1"></father>
<child id="PER-2" father="PER-1"></child>
DÉFINIR LES ENTITÉS
Définition
Une entité peut-être considérée comme un alias permettant de
réutiliser des informations au sein du document XML ou de la définition
DTD.
DÉFINIR LES ENTITÉS
Les entités générales
Définition
Les entités générales Elles permettent d'associer un alias à une
information afin de l'utiliser dans le document XML.
La syntaxe
<!ENTITY nom "valeur">
Pour utiliser une entité générale dans notre document XML, il suffit
d'utiliser la syntaxe suivante :
&nom;
DÉFINIR LES ENTITÉS
Exemple :
<!ENTITY langage1 "C#">
<!ENTITY langage2 "JAVA">
<Programme>
<langage>&langage1;</langage>
<système>Windows Mobile</système>
</Programme>
<Programme>
<langage>&langage2;</langage>
<système>Android</système>
</Programme>
DÉFINIR LES ENTITÉS
Exemple :
Au moment de son interprétation, les références aux entités seront
remplacées par leurs valeurs respectives, ce qui donne une fois
interprété :
<Programme>
<langage>C#</langage>
<système>Windows Mobile</système>
</Programme>
<Programme>
<langage>JAVA</langage>
<système>Android</système>
</Programme>
EXERCICES
Exercice 1
Rédiger un document xml valide à cette DTD [Link]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT biblio (livre)*>
<!ELEMENT livre (titre, auteur, nb_pages)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT nb_pages (#PCDATA)>
Exercice 2
<!DOCTYPE racine[
<!ELEMENT racine (Maison*)>
<!ELEMENT Maison (NumMaison, AdresseMaison, CoutMaison,
Cabinet ?, Maçon*)>
<!ELEMENT NumMaison (#PCDATA)>
<!ELEMENT AdresseMaison (#PCDATA)>
<!ELEMENT CoutMaison (#PCDATA)>
<!ATTLIST Maison Categorie (A | B | C) "A" #REQUIRED>
<!ELEMENT Cabinet (NumCabinet,NomCabinet)>
<!ELEMENT NumCabinet (#PCDATA)>
<!ELEMENT NomCabinet (#PCDATA)>
<!ELEMENT Maçon (NumMaçon, NomMaçon)>
<!ELEMENT NumMaçon (#PCDATA)>
<!ELEMENT NomMaçon (#PCDATA)>
]>
Exercice 3
Rédiger une DTD pour une bibliographie. Cette bibliographie :
contient des livres et des articles ;
les informations nécessaires pour un livre sont :
• son titre général ;
• les noms des auteurs ;
• ses tomes et pour chaque tome, leur nombre de pages ;
• des informations générales sur son édition comme par exemple
le nom de l'éditeur, le lieu d'édition, le lieu d'impression, son
numéro ISBN ;
les informations nécessaires pour un article sont :
• son titre ;
• les noms des auteurs ;
• ses références de publication : nom du journal, numéro des
pages, année de publication et numéro du journal
on réservera aussi un champ optionnel pour un avis personnel.
Exercice 4
Modifier la DTD précédente...
• ... en ajoutant un attribut optionnel soustitre à l'élément titre ;
• ... en faisant de l'élément tome un élément vide et en lui ajoutant un
attribut requis nb_pages et un attribut optionnel soustitre ;
• ... en faisant de l'élément nom_journal un attribut de
l'élément journal et en lui donnant comme valeur par défaut Feuille
de Chou ;
• ... en faisant de l'élément annee un attribut de type énuméré, prenant
comme valeurs possibles 2000, 2001, 2002, "avant_2000" et
"inconnue" et proposant comme valeur par défaut inconnue.
• Utiliser cette DTD pour créer un fichier XML valide.