mardi 23 octobre 2012

DTD


1.Document valide

Un document XML a besoin d'une DTD pour savoir ce qu'il est possible de faire ou pas.
Si l'on fait la comparaison avec l'HTML, on sait que théoriquement on doit écrire:

<html>
    <head>
    </head>
    <body>
        <table>
            <tr>
                <td>
                </td>
            </tr>
        </table>
    </body>
</html>


et non pas

<html>
    <head>
    </head>
        <table>
                <td>
                </td>
        </table>
</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.
Avec la DTD, on va pouvoir décrire de manière stricte la structure du fichier XML. Avec des outils on pourra alors vérifier qu'un fichier XML est "valide" pour une DTD donnée.

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" ?> où racine est le nomde la balise racine de l'arbre XML.
Reprenons notre fichier XML d'exemple et ajoutons-y cette ligne:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE annuaire SYSTEM "annuaire.dtd">
<annuaire>
    <personne type="étudiant">
        <nom>HEUTE</nom>
        <prenom>Thomas</prenom>
        <email>webmaster@xmlfacile.com</email>
    </personne>
    <personne type="chanteur">
        <nom>SOUCHON</nom>
        <prenom>Alain</prenom>
        <email>alain@souchon.name</email>
    </personne>
</annuaire>


<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT annnuaire     (personne*)>
<!ELEMENT personne  (nom,prenom,email+)>
<!ATTLIST personne type (étudiant | professeur | chanteur | musicien) "étudiant">
<!ELEMENT nom       (#PCDATA)>
<!ELEMENT prenom    (#PCDATA)>
<!ELEMENT email (#PCDATA)>


Voici ce que pourrait-être sa DTD:
  • Pour chacun des éléments, on défini sa composition par <!ELEMENT nom_element (structure)>
  • Pour chacun des attributs, on défini sa composition par <!ELEMENT nom_element nom_attribut (structure)>
  • L'attribut type est, ici, défini comme étant un choix imposé entre "étudiant", "professeur", "chanteur" et "musicien", par défaut on met étudiant (facultatif).
  • personne* signifie que dans un élément annuaire on peut trouver de 0 ou plusieurs éléments de type personne.
  • nom,prenom,email+ signifie que dans un élément personne on doit trouver une élément nom, un élément prenom et un ou plusieurs élément(s) email dans cet ordre.
  • nomprenom et email sont des éléments qui peuvent contenir du texte, les contenus #PCDATA sont dits contenus mixtes
  • 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.

3.La syntaxe

Reprenons les différents indicateurs d'occurences:
  • pas de symbole veut dire 1 et 1 seul élément
  • + veut dire 1 ou plusieurs éléments
  • * veut dire 0 ou plusieurs éléments
  • ? veut dire 0 ou 1 éléments
Ces symbles sont placés juste après les noms des éléments.

Et voici les différents connecteurs possibles:
  • , les différents éléments séparés par une virgule doivent apparaître dans l'ordre donné
  • | signifie qu'un seul des deux éléments séparés par ce symbole doit apparaître dans le fichier XML
Ces symbles sont placés entre deux éléments.
  • On peut composer les différents connecteurs en utilisant les parenthèses. Toutefois, il faut veiller à ne pas définir une gramaire trop ambigüe par exemple ((nom,prenom)|(nom,surnom)) n'est pas correct, il est préférable d'écrire (nom,(prenom|surnom)).
  • On peut autoriser plusieurs éléments répétés, par exemple (adresse,telephone)* ce qui permet de créer des couples (adresse,telephone).
Les attributs (déclarés par ATTLIST) possèdent différents contrôles:
  • CDATA pour une chaîne quelconque de caracères
  • ID pour un nom unique dans le document (identifiant)
  • IDREF pour un numéro d'idantifiant du document (création d'un lien dans le document)
  • ENTITY entité externe
  • ENTITIES liste d'ENTITY séparées par des espaces
  • NMTOKEN pour un mot sans espace
  • NMTOKENS pour une liste de NMTOKEN séparés par des espaces
Les valeurs des attributs peuvent être précisées par la DTD.
  • #REQUIRED signifie que la valeur doit-être donnée dans le document
  • #IMPLIED signifie que s'il n'y a pas de valeur dans le document, c'est à l'application de donner la sienne par défaut
  • #FIXED signifie que la valeur doit être celle de la DTD
  • une valeur par défaut que va prendre l'attribut si aucune valeur n'est donnée dans le fichier XML

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és 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.

Aucun commentaire:

Enregistrer un commentaire