Programmation XML/Définition de Type Document

Un livre de Wikibooks.

Programmation XML
Programmation XML
Sommaire
Modifier ce modèle

[modifier] Introduction

Le DTD permettent de décrire la forme que doit avoir un document XML pour être valide. Les DTD ont été remplacées par XML Schema qui est bien plus puissant et expressif, aussi nous vous encourageons, pour tout nouveau projet de favoriser systématiquement l'utilisation de Schema aux DTD.

Nous abordons toutefois les DTD ici, afin que vous puissiez en comprendre une si besoin. Notamment, vous pourriez être amener à transformer une DTD en un Schema pour utiliser cette nouvelle technologie.

[modifier] Spécification d'une DTD

Contrairement aux Schema, la DTD n'est pas un dialecte XML, c'est un langage spécifique.

La DTD n'est pas obligatoire. Elle peut être interne au document XML ou bien externe (dans un fichier à l'extension '.dtd'). On utilise la DTD externe lorsque l'on veut la partager entre plusieurs fichiers XML.

Exemple de déclaration d'une DTD externe dans un fichier XML :

<!DOCTYPE repertoire SYSTEM "repertoire.dtd">

La DTD commence par la balise :

<!DOCTYPE nom-element-racine [

et se termine par :

]>

La DTD doit être placée après la déclaration initiale XML.

Les commentaires, comme en XML sont utilisés de la manière suivante :

<!-- commentaires -->

Chaque élément de la DTD est défini de la manière suivante :

<!ELEMENT nom-element qualificateur>

Les qualifieurs possibles sont :

  • ANY : la structure de l'élément est libre
  • #PCDATA(Parsed Character Data) : donnée textuelle analysable
  • EMPTY : l'élément est vide

On peut préciser ces qualifieurs grâce aux éléments suivants :

  • un et un seul sous-élément :

(un seul téléphone par personne)

<!ELEMENT personne(telephone)>
  • 0 ou plusieurs sous-éléments :

(une personne peut avoir 0, 1 ou plusieurs téléphones)

<!ELEMENT personne(telephone*)>
  • 1 ou plusieurs éléments :

(une personne doit avoir au moins un télephone)

<!ELEMENT personne(telephone+)>
  • 0 ou 1 seul élement :

(une personne a au maximum 1 téléphone, elle peut ne pas en avoir)

<!ELEMENT personne(telephone?)>
  • Plusieurs sous-éléments différents :

(une personne a un nom et un téléphone)

<!ELEMENT personne(nom, telephone)>
  • Des sous-éléments identiques ou non :

(une personne a un nom et deux numéros de téléphone)

<!ELEMENT personne(nom, telephone, telephone)>
  • Un sous-élément OU (exclusif) un autre :

(un ou deux téléphone par personne)

<!ELEMENT personne(telephone|(telephone, telephone))>



Exemple : Stockage d'un repertoire de services. Chaque service a un nom et peut avoir un ou plusieurs téléphone(s)

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE repertoire [
	<!ELEMENT repertoire (service)*>
	<!ELEMENT service (nom, tel*)>
	<!ELEMENT nom (#PCDATA)>
	<!ELEMENT tel (#PCDATA)>
]>
<repertoire>
   <service>
      <nom>pompiers</nom>
      <tel>18</tel>
   </service>
   <service>
      <nom>police</nom>
      <tel>17</tel>
      <tel>22</tel>
   </service>
   <service>
      <nom>samu</nom>
      <tel>15</tel>
   </service>
</repertoire>