Vous êtes sur la page 1sur 37

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 "cv.dtd">

<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 "cv.dtd" [

]>
<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é livres.dtd :

<!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 ex1.dtd

<?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.

Vous aimerez peut-être aussi