Création d'une DTD
La DTD (Document Type Definition ou en français Définition de Type de Document) permet de définir le langage à balises personnalisées.
La DTD est une grammaire permettant de vérifier la conformité du document XML.
Ainsi on parlera de:
- document valide pour un document XML comportant une DTD
- document bien formé pour un document XML ne comportant pas de DTD mais répondant aux règles d'écritures du XML
Utiliser les DTD
Une DTD est un ensemble de règles permettant de définir un langage à balises personnalisées en XML
<master>
<artiste>
<prenom>Paul</prenom>
<nom>Baudry</nom>
<date_naissance>7 novembre 1828 </date_naissance>
<lieu_naissance>La Roche sur Yon, France</lieu_naissance>
<date_mort>17 janvier 1886</date_mort>
<lieu_mort>Paris, France</lieu_mort>
<mouvements>Académique</mouvements>
</artiste>
</master>
Une DTD définit une liste des éléments et de tous les éléments enfants de chaque élément.
<!ELEMENT master (artiste*)>
<!ELEMENT artiste (prenom, nom, date_naissance, lieu_naissance, date_mort, lieu_mort, mouvements)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT date_naissance (#PCDATA)>
<!ELEMENT lieu_naissance (#PCDATA)>
<!ELEMENT date_mort (#PCDATA)>
<!ELEMENT lieu_mort (#PCDATA)>
<!ELEMENT mouvements (#PCDATA)>
Où écrire la DTD ?
Cette grammaire peut s'écrire principalement à deux endroits. En interne, dans le document XML. Ou dans un fichier externe relié au document XML.
Une DTD en interne s'écrit de cette façon : le mot clef DOCTYPE est suivi de l'élément racine et la DTD est entre crochets
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE master[
]>
<master>
<artiste>
<prenom>Paul</prenom> <!--la suite -->
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE master SYSTEM "peintres.dtd">
<master>
<artiste>
<prenom>Paul</prenom> <!--la suite -->
Définir un élément qui contient plusieurs enfants
Un élément XML contient souvent plusieurs éléments enfants. On peut définir une séquence d'éléments enfants qui définit également l'ordre d'apparition de ces enfants.
La première ligne définit une suite obligatoire des éléments enfants. la deuxième un ordre aléatoire.
<!ELEMENT artiste (prenom, nom, date_naissance, lieu_naissance, date_mort, lieu_mort, mouvements)>
<!ELEMENT artiste (prenom | nom, date_naissance | lieu_naissance | date_mort | lieu_mort | mouvements)>
Définir un élément qui contient du texte
De nombreux éléments ne contiennent que du texte.
Pour la partie du XML ci-dessous, on a un élément qui contient deux éléments qui ne contiendront que du texte.
<patronyme>
<prenom>Paul</prenom>
<nom>Baudry</nom>
</patronyme>
<!ELEMENT patronyme (prenom, nom)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT nom (#PCDATA)>
Définir un élément vide
Les éléments vides ne contiennent aucune données.
<image href="file://baudry.jpg"/>
<!ELEMENT image EMPTY>
Définir un élément pouvant contenir n'importe quoi
Cette règle est à utiliser avec parcimonie. Sinon la DTD n'a plus de raison d'exister.
<!ELEMENT nom_balise ANY>
Utiliser des quantificateurs
Les DTD permettent d'autoriser plusieurs occurences d'un élément enfant. Les quantificateurs définissent le nombre de fois ou l'élément enfant apparaitra dans son élément parent
Opérateur | Signification | Exemple |
+ | L'élément doit être présent au minimum une fois | A+ |
* | L'élément peut être présent plusieurs fois (ou aucune) | A* |
? | L'élément peut être optionnellement présent | A? |
| | L'élément A ou l'élément B peuvent être présents | A|B |
, | L'élément A doit être présent et suivi de l'élément B | A,B |
() | Les parenthèses permettent de regrouper des éléments afin de leur appliquer les autres opérateurs | (A,B)+ |
<!ELEMENT master (artiste*)>
L'élément artiste est présent 0 ou plusieurs fois dans l'élément racine master
Définir des attributs
Les attributs sont faits pour stocker des informations sur les contenus et ne font pas partie du contenu proprement dit.
- <!ATTLIST
- balise est le nom de l'élément.
- nom_attribut est le nom de l'attribut
- CDATA signifie qu'il s'agit de texte qui ne sera donc pas analysé. état est l'état facultatif de l'attribut et peut valoir #IMPLIED pour indiquer que l'attribut peut être omis ou #REQUIRED pour signaler que cet attribut doit toujours être présent et contenir une valeur.
<!ATTLIST auto carburant CDATA #REQUIRED>
l'élément XML auto s'écrira dans le document XML :
<auto carburant="essence">Sandero</auto>
Définir des valeurs par défaut
On peut utiliser #FIXED pour permettre de garantir qu'un attribut aura toujours une certaine valeur, qu'il apparaisse ou non dans le document XML.
<!ATTLIST auto révision CDATA #FIXED "kilomètres">
<auto révision="kilomètres">10000</auto>
Définir des attributs avec des choix
Un attribut pourra prendre différentes valeurs prédéfinies.
#CDATA disparaît car le chois d'attribut est spécifié.
<!ATTLIST auto carburant (essence | gasoil) #REQUIRED>
<auto carburant="essence">Mini Cooper</auto>
Définir des attributs à valeur unique
Très pratique pour identifier de produits.
<!ATTLIST livre isbn ID #REQUIRED>
<livre isbn="978-2-86889-006-1">Lobo le loup</livre>
<!ATTLIST coureur position ID #REQUIRED>
<coureur position="25">Jean Lubie</coureur>
Utiliser les attributs ayant des valeurs uniques
L'attribut de type IDREF va pointer vers l'attribut d'un autre élément.
<!ATTLIST coureur position ID #REQUIRED>
<coureur position="25">Jean Lubie</coureur>