8.DTD

8.1.Document valide

Pour pouvoir être traité correctement un fichier XML doit nécessairement répondre à une structure donnée. L'outil (ou même l'humain) doit savoir où trouver les informations. Et il peut être en droit d'attendre telle ou telle information à telle endroit, telle ou telle type de valeur dans tel ou tel attribut, etc. Bref, le document XML doit être valide.
Si l'on fait la comparaison avec l'HTML, on sait que théoriquement on doit écrire:
<html>
    <head>
    </head>
    <body>
        <h1>Mon site web</h1>
    </body>
</html>
et non pas
<html>
    <head>
    </head>
    <h1>Mon site web</h1>
</html>
Il y a certaines règles à respecter même si les navigateurs ont été programmés pour comprendre à peu près n'importe quoi. Ainsi, la balise <html> doit contenir les balises <head> et <body>. La balise <h1> ne peut apparaître directement après <head>.
Alors, on peut faire confiance à celui qui créé le document XML pour respecter des règles explicites ou implicites mais le mieux c'est encore de décrire ces règles dans un document. Document qui pourra servir au contrôle automatique du document XML par un outil.
Il existe 2 normes de documents de validation:
  • DTD
  • XML Schema
Ici, nous verrons la DTD.

8.2.Un exemple de DTD

Une DTD peut être définie soit à l'intérieur d'un document XML soit dans un fichier à part. Cette dernière solution est la plus fréquente car la plus pratique.
Pour définir une DTD externe, il suffit d'écrire <!DOCTYPE racine SYSTEM "nomdufichier.dtd"> juste après <?xml version="1.0" ?>racine est le nom de la balise racine de l'arbre XML.
Reprenons notre fichier XML d'exemple et ajoutons-y cette ligne (ainsi que quelques donnees supplémentaires):
<?xml version="1.0"?>
<!DOCTYPE encyclopedie SYSTEM "encyclopedie.dtd">
<encyclopedie>
    <personne datenaissance="1942-01-08" sexe="H">
        <nom>HAWKING</nom>
        <prenom>Stephen</prenom>
        <publication>Une brève histoire du temps</publication>
    </personne>
    <personne datenaissance="1932-07-13" sexe="H">
        <nom>REEVES</nom>
        <prenom>Hubert</prenom>
        <publication>L'Univers expliqué à mes petits-enfants</publication>
        <publication>Patience dans l'azur, L'évolution cosmique</publication>
        <publication>Poussières d'étoiles</publication>
    </personne>
    <personne datenaissance="1879-03-14" sexe="H">
        <nom>EINSTEN</nom>
        <prenom>Albert</prenom>
        <publication>Des ondes gravitationnelles</publication>
        <publication>Sur la théorie quantique du rayonnement</publication>
    </personne>
    <personne datenaissance="1867-11-07" sexe="F">
        <nom>CURIE</nom>
        <prenom>Marie</prenom>
        <publication>traité de radioactivité</publication>
    </personne>
</encyclopedie>
Voici ce que pourrait-être sa DTD:
<?xml version="1.0"?>
<!ELEMENT encyclopedie     (personne*)>
<!ELEMENT personne  (nom,prenom,publication+)>
<!ATTLIST personne sexe (H | F) "H">
<!ELEMENT nom       (#PCDATA)>
<!ELEMENT prenom    (#PCDATA)>
<!ELEMENT publication (#PCDATA)>
  • Pour chacun des éléments, on définit sa composition par <!ELEMENT nom_element (structure)>
  • Pour chacun des attributs, on définit sa composition par <!ATTLIST nom_element nom_attribut (structure)>
  • L'attribut sexe de la balise <personne> est, ici, défini comme étant un choix imposé entre "H" et "F". Les valeurs possibles sont séparées par des caractères '|'. Cet attribut n'étant pas indiqué comme obligatoire, s'il n'est pas précisé alors il prendra par défaut la valeur "H" (la valeur précisée entre guillemets après la liste)
  • personne* signifie que dans un élément <encyclopedie> on peut trouver de 0 à plusieurs éléments de type <personne> à l'exclusion de tout autre élément
  • nom,prenom,publication+ signifie que dans un élément personne on doit trouver un et un seul (*) élément <nom>, un et un seul élément <prenom> et un ou plusieurs (+) éléments <publication> et dans cet ordre (comme imposé par la virgule)
  • <nom>, <prenom> et <publication> sont des éléments qui peuvent contenir du texte comme l'indique #PCDATA. On parle de contenu mixte
  • Deux autres types pour les éléments existent, EMPTY et ANY, empty signifie que l'élément est vide (comme <br/> en HTML), ANY indique que l'élément peut comporter tout autre élément déclaré dans la DTD.