Un document XML est bien formé lorsqu'il respecte les règles syntaxiques .
Une DTD (document type definition) permet définir un sous-ensemble de documents xml bien formé.
Ainsi une DTD précise :
Comme il existe de multiples façons d'organiser l'information sous forme arborescente, une DTD permet de se conformer à une organisation particulière et ainsi garantir une parfaite uniformité entre documents de sources diverses.
Un document bien formé respectueux des contraintes imposées par une DTD est dit valide par rapport à la DTD .
La DTD relative à un document xml peut être intégrée (DTD interne) ou liée au document (DTD externe).
<?xml version="1.0" encoding="ISO-8859-1"?>
<courrier>
<destinataire> albert@free.fr</destinataire>
<expediteur> anne@ifrance.com</expediteur>
<date>
<jour> 15 </jour>
<mois> septembre </mois>
<annee> 2005 </annee>
</date>
<contenu langue="fr">
<objet> rappel</objet>
<texte> réunion le 20</texte>
<attachement fichier = "resume.txt" />
</contenu>
</courrier>
<!DOCTYPE courrier[
<!ELEMENT courrier (destinataire+,expediteur,date,contenu)>
<!ELEMENT expediteur (#PCDATA)>
<!ELEMENT destinataire (#PCDATA)>
<!ELEMENT date (jour,mois,annee)>
<!ELEMENT jour (#PCDATA)>
<!ELEMENT mois (#PCDATA)>
<!ELEMENT annee (#PCDATA)>
<!ELEMENT contenu (objet,texte,attachement*)>
<!ATTLIST contenu langue (fr|en) #REQUIRED>
<!ELEMENT objet (#PCDATA)>
<!ELEMENT texte (#PCDATA)>
<!ELEMENT attachement EMPTY>
<!ATTLIST attachement fichier CDATA #REQUIRED>
]>
Lorsque le doctype est localisé dans un fichier séparé, seules les définitions sont spécifiées.
<!ELEMENT courrier (destinataire+,expediteur,date,contenu)>
<!ELEMENT expediteur (#PCDATA)>
<!ELEMENT destinataire (#PCDATA)>
<!ELEMENT date (jour,mois,annee)>
<!ELEMENT jour (#PCDATA)>
<!ELEMENT mois (#PCDATA)>
<!ELEMENT annee (#PCDATA)>
<!ELEMENT contenu (objet,texte,attachement*)>
<!ATTLIST contenu langue (fr|en) #REQUIRED>
<!ELEMENT objet (#PCDATA)>
<!ELEMENT texte (#PCDATA)>
<!ELEMENT attachement EMPTY>
<!ATTLIST attachement fichier CDATA #REQUIRED>
L'appel à une DTD externe dans un fichier XML est réalisé ainsi
<!DOCTYPE courrier SYSTEM "http://...adresse complete de la DTD">
<!ELEMENT nom_de_l'élément (contenu de l'élément)>
<!ELEMENT expediteur (#PCDATA)>
<!ELEMENT nom_de_l'élément (#PCDATA)>
ou
<!ELEMENT nom_de_l'élément CDATA>
CDATA signifie character data
#(PCDATA) signifie parsed character data : données textuelles interprétées
Lorsque les données sont interprétées les signes '<' et '>' sont traités comme des délimiteurs de balises.
<!ELEMENT nom_de_l'élément EMPTY>
<!ELEMENT attachement EMPTY>
<!ELEMENT nom_de_l'élément (élément_enfant)>
ou
<!ELEMENT nom_de_l'élément (élément_enfant1, élément_enfant2... élément_enfantN)>
<!ELEMENT date (jour, mois, annee)>
L'ordre des éléments enfants, donné par la la DTD , doit être respecté dans le document xml associé.
<!ELEMENT nom_de_l'élément (élément_enfant1 | élément_enfant2... | élément_enfantN)>
L'élément possède un seul élément enfant choisi parmi la liste d'éléments proposés. Lorsque qu'un contenu textuel (#PCDATA) fait partie du choix, celui-ci est propsé en premier :
<!ELEMENT nom_de_l'élément (#PCDATA | élément_enfant1... | élément_enfantN)>
Un élément, une séquence ou un choix peuvent être complété d'un opérateur d'occurence.
L'opérateur * : terme* signale 0 ou plusieurs occurences du terme
<!ELEMENT contenu (objet,texte,attachement*)>
indique qu'un contenu est constitué d'un élément "objet", suivi d'un élément "texte" et éventuellement, mais pas nécessairement, complété par un ou plusieurs éléments "attachement".
L'opérateur + : terme+ signale une ou plusieurs occurence du terme
<!ELEMENT courrier (destinataire+,expediteur,date,contenu)>
indique qu'un courrier est constitué d'un ou plusieurs éléments "destinantaire", suivi d'un élément "expéditeur", d'un élément "date" et d'un élément "contenu")
L'opérateur ? : terme? signale que le terme est facultatif (0 ou 1 occurence)
<!ELEMENT coordonnees (nom,prenom,adresse,telephone?)>
l'élément "coordonnées" est constitué des éléments "nom", "prenom" , "adresse" qui sont obligatoire et d'un éventuel élément "telephone".
Une alternative peut porter sur du texte (#PCDATA), des éléments simples, des séquences :
<!ELEMENT elt ((a,b,c) | (b,d) | x | #PCDATA>
Une séquence peut porter sur du texte (#PCDATA), des éléments simples, des alternatives :
<!ELEMENT elt (#PCDATA, x, (a|b|c) , (b|d)>
Les opérateurs d'occurence s'appliquent aux éléments simples, aux séquences et aux alternatives
<!ELEMENT elt (x*, (a|b|c)+ , (b|d)?>
En combinant on peut obtenir des expressions complexes :
<!ELEMENT elt ((x*, (a|b|c) , (b,d)+) | ((a*,b,c)+ , (d|e|#PCDATA), (x+,y)*)>
<!ELEMENT nom_de_l'élément ANY>
Signifie que l'élément peut être constitué de texte ou de tout autre élément défini dans la DTD en nombre, ordre et profondeur quelconques. Ce type de déclaration est a éviter allant à l'encontre du principe d'une DTD consitant à containdre les contenus des éléments.
Pour chaque élément on déclare les attributs qu'ils admettent.
<ATTLIST nom_element
nom_attribut type contrainte
nom_attribut type contrainte
...
>
<!ELEMENT publication EMPTY>
<!ATTLIST publication
titre CDATA "sans titre"
type (livre|revue) "livre"
L'attribut est obligatoire. Son absence invalide le document
<!ELEMENT publication EMPTY>
<!ATTLIST publication
titre CDATA #REQUIRED
type (livre|revue) "livre"
L'attribut n'est pas obligatoire. Son absence n'invalide pas le document.
<!ELEMENT publication EMPTY>
<!ATTLIST publication
titre CDATA #REQUIRED
type (livre|revue) #IMPLIED
La valeur de l'attribut est imposée. Une autre valeur invalide le document.
<!ELEMENT publication EMPTY>
<!ATTLIST publication
titre CDATA #REQUIRED
type (livre|revue) #FIXED "livre"
Les entités permettent de définir des raccourcis qui sont remplaçés par leur valeur dans le document
Une entité paramétrique définit des raccourcis qui ne sont utilisable qu'au sein de la DTD.
<!ENTITY % level CP|CE1|CE2|CM1|CM2 >
qu'on pourra utiliser dans la DTD :
<!ELEMENT classe (enseignant)
<!ATTLIST classe niveau (%level;) #REQUIRED>
Permet d'attribuer un raccourci mnémonique aux caractères. Indispensable pour la saisie de caractères ayant une signification particulière en xml comme <, >, ", ou &.
C'est le code hexadécimal qui permet définition d'une entité caractère.
<!ENTITY euro"⍩" > qui sera remplaçé par ""
<!ENTITY nbsp " "> qui sera remplaçé par un espace insécable
<!ENTITY eacute "é"> qui sera remplaçé par "é"
Une entité interne définit un raccourci pour une suite quelconques de caractères dans la DTD, et est utilisable dans le document xml associé.
<!ENTITY umb "Université Marc Bloch">
qui pourra être utilisé dans le document xml associé :
<diplome>
<intitulé> Master Caweb </intitulé>
<organisme> &umb; </organisme>
</diplome>
Une entité externe permet de faire référence à un fichier externe.
<!ENTITY umb SYSTEM "umb.xml">
Le fichier umb.xml :
<?xml version="1.0" encoding="ISO-8859-1"?>
<organisme>
<intitulé> Université Marc Bloch</intitulé>
<adresse> rue de Rome Strabourg </adresse>
</organisme>
Dans le fichier associé à la DTD on pourra écrire :
<?xml version="1.0" encoding="ISO-8859-1"?>
<etudiant>
<nom> Dupond </nom>
&umb;
</etudiant>
qui sera transformé en :
<?xml version="1.0" encoding="ISO-8859-1"?>
<etudiant>
<nom> Dupond </nom>
<organisme>
<intitulé> Université Marc Bloch</intitulé>
<adresse> rue de Rome Strabourg </adresse>
</organisme>
</etudiant>
L'entité externe ne doit pas contenir ou être liée à une DTD. Son contenu doit être valide par rapport à la DTD du document faisant référence à l'entité externe.
Au sein d'une DTD on peut également faire appel à une entité paramétrique externe :
<!ENTITY % a_inclure SYSTEM "sousdtd.dtd">
En faisant référence à l'entité %a_inclure; dans la dtd, le contenu de "sousdtd.dtd" est incorporé en lieu et place de la référence.