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

La DTD se contente essentiellement d'identifier les éléments et leurs attributs. Les éléments du XML sont les unités fondamentales. Ils peuvent contenir des données ou d'autres éléments et posséder des attributs.
<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 -->
Une DTD externe est détachée dans un fichier séparé. Elle ne contient que les règles mais elle est appelée dans l'entête du document XML. Le document XML n'est plus se suffit plus à lui même, on donne la valeur no à l'attribut standalone.
<?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.

Pour l'élement image :
<image href="file://baudry.jpg"/>
Il faut écrire sa règle comme ceci :
<!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

Important: Un élément sans quantificateur doit apparaître une et une seule fois.
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.

Un attribut doit apparaitre dans la DTD pour que son utilisation soit validée dans le XML. Une définition d'attribut est composée de quatre parties :<!ATTLIST balise nom_attribut CDATA état>
  • <!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>
Une liste de livres qui ont besoin d'être identifiés par leur code sans que celui-ci apparaisse dans les données.
<livre isbn="978-2-86889-006-1">Lobo le loup</livre>
Une course à pieds aura un unique premier, un unique second…
<!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.

recette est un élément et ingredients aussi. Le chocolat utilisé comme ingrédient apparait dans une recette.
<!ATTLIST coureur position ID #REQUIRED>
<coureur position="25">Jean Lubie</coureur>