DTD - XML Facile!

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:
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)>

8.3.La syntaxe

Reprenons les différents indicateurs d'occurences: Ces symbles sont placés juste après les noms des éléments.

Et voici les différents connecteurs possibles: Ces symbles sont placés entre deux éléments.
Les attributs (déclarés par ATTLIST) possèdent différents contrôles: Les valeurs des attributs peuvent être précisées par la DTD.

8.4.Conclusion

Il est très important d'avoir une bonne DTD et donc de passer du temps à sa conception. C'est elle qui vous permettra de construire des documents XML valides. Il peut-être aussi astucieux d'utiliser des DTD existantes et éventuellement de les modifier, c'est généralement plus efficace que de tout refaire à 0. Par exemple, il est plus que probable qu'une DTD définissant un annuaire existe déjà et qu'il prend en compte des choses auxquelles vous n'aviez pas pensé comme l'Etat aux USA par exemple.
Jusque là, on a défini une structure qui pourra être utilisée dans de nombreux outils. On peut ainsi stocker des données (dans des fichiers XML) reste à trouver le moyen de les mettre en forme: c'est le rôle entre autres d'XSL.