EPITA
XML et les services Web

Jean-François Perrot 

DTD : Document Type Definition


  1. I. Validation d'un document XML.
    1. Préambule 
    2. Trois techniques
    3. Outillage

  2. II. Les DTDs (Document Type Definition)
    1. Métagrammaire des DTDs
      1. Principe
      2. Et les namespaces ?
    2. Exemples
      1. Représentation par enfants
      2. Représentation par attributs
    3. Déclaration de la DTD d'un document
      1. Déclaration interne
      2. Déclaration externe SYSTEM
      3. Déclaration externe PUBLIC
      4. Le point de vue DOM (Java)

  3. III. La notion de référence
    1. Problème à résoudre
    2. Question technique
    3. Exemple de document XML avec références
    4. La DTD familiale
    5. DOM et getElementById()

  4. IV. Les entités
    1. Idée générale
    2. Un usage fréquent : les entités-caractères
    3. Entités utilisées dans la DTD elle-même

  5. V. Mise en pratique

I. Validation d'un document XML.


II. Les DTDs (Document Type Definition)

  1. Métagrammaire des DTDs

  2. Exemples

    Représentation par enfants

    [ fichier Nom_note2.xml]

    <?xml version="1.0" ?>
    <liste>
    <eleve>
    <nom> Toto</nom> <note> 12 </note>
    </eleve>
    <eleve>
    <nom> Tata</nom> <note> 13 </note>
    </eleve>
    <eleve>
    <nom> Tutu</nom> <note> 17 </note>
    </eleve>
    <eleve>
    <nom> Titi</nom> <note> 11 </note>
    </eleve>
    </liste>


    [ fichier Nom_note2.dtd]

    <?xml version="1.0" encoding='ISO-8859-1'?>
    <!-- Tableau Noms-Notes par enfants -->
    <!ELEMENT liste (eleve*)>
    <!ELEMENT eleve (nom, note)>
    <!ELEMENT nom (#PCDATA)>
    <!ELEMENT note (#PCDATA)>

    Ce qui se lit :
    1. L'élément liste contient un nombre quelconque d'éléments eleve.
    2. L'élément eleve contient un élément nom suivi d'un élément note.
    3. Les éléments nom et note contiennent des chaînes de caractères
      qui seront analysées par le parseur (PCDATA = Parsed Character Data).
      Il n'est malheureusement pas possible d'en dire plus sur la nature des ces chaînes :
      par exemple, on ne sait pas exprimer que la note doit désigner un entier, et encore moins de spécifier que cet entier doit être compris entre 0 et 20 !
    Représentation par attributs

    [ fichier Nom_note1.xml]

    <?xml version="1.0" ?>
    <liste>
    <eleve nom="Toto" note="12"/>
    <eleve nom="Tata" note="13"/>
    <eleve nom="Tutu" note="17"/>
    <eleve nom="Tutu" note="11"/>
    </liste>


    [fichier Nom_note1.dtd] :

    <?xml version="1.0" encoding='ISO-8859-1'?>
    <!-- Tableau Noms-Notes par attributs -->
    <!ELEMENT liste (eleve*)>
    <!ELEMENT eleve EMPTY>
    <!ATTLIST eleve nom CDATA #REQUIRED>
    <!ATTLIST eleve note CDATA #REQUIRED>

    Les attributs de l'élément (vide) eleve sont nom et note,
    dont les valeurs sont des chaînes de caractères non analysées (type CDATA),
    et dont la présence est obligatoire (indicateur #REQUIRED).
    Même remarque sur l'impossibilité de contraindre les chaînes en question.

  3. Déclaration de la DTD d'un document

    Il s'agit de déclarer dans le document lui-même à quelle DTD il se réfère.
    Comme nous l'avons vu avec la commande xmllint, cette information n'exclut nullement de contrôler le document avec une autre DTD,
    imposée par le contrôleur.

    La DTD d'un document XML est considérée dans le modèle DOM comme faisant partie de l'arbre du Document.
    Elle est répertoriée dans la typologie DOM comme DOCUMENT_TYPE_NODE décrit par l'interface DocumentType.
    On peut l'obtenir à partir de l'objet Document par la méthode getDocType().
    Sur la manière d'engendrer une déclaration de DTD lors de la confection d'un Document, voir plus loin.

III. La notion de référence

  1. Problème à résoudre

    Soit à représenter une structure familiale comme :   famille Comment représenter les relations de parenté en XML ?
    en introduisant une notion de référence, qui jouera le rôle d'un identifiant unique pour désigner un élément de type Personne.

  2. Question technique

    Le problème des références et sa solution : les types ID et IDREF

    Les données qui figurent dans un fichier XML sont des chaînes de caractères.
    Comment imposer que les références soient uniques ?
    Réponse : via la DTD !

    Le métalangage des DTDs comporte deux types d'attributs ID et IDREF :

    La déclaration de ces types dans la DTD entraîne les vérifications d'existence et d'unicité qui correspondent à la notion intuitive de référence :

  3. Exemple de document XML avec références

    (fichier Famille.xml)
    <?xml version="1.0" ?>
    <!DOCTYPE liste SYSTEM "Famille.dtd">
    <liste>

    <Personne nom="Marie" sexe="F" ref="P1">
    <!-- les parents de Marie ne sont pas connus de nous -->
    <enfants>
    <RefPersonne maref="P2"/>
    <RefPersonne maref="P3" />
    </enfants>
    </Personne>

    <Personne nom="Jean" sexe="M" ref="P2">
    <mere>
    <RefPersonne maref="P1"/>
    </mere>
    <enfants/>
    </Personne>

    <Personne nom="Pierrette" sexe="F" ref="P3">
    <mere>
    <RefPersonne maref="P1"/>
    </mere>
    <enfants>
    <RefPersonne maref="P4"/>
    </enfants>
    </Personne>

    <Personne nom="Julie" sexe="F" ref="P4">
    <mere>
    <RefPersonne maref="P3"/>
    </mere>
    <enfants/>
    </Personne>

    </liste>

  4. La DTD familiale

    (fichier Famille.dtd)
    <?xml version="1.0" encoding='ISO-8859-1'?>
    <!-- Famille avec re'fe'rences -->
    <!ELEMENT liste (Personne*)>
    <!ELEMENT Personne (pere?, mere?, enfants)>
    <!ELEMENT pere (RefPersonne)>
    <!ELEMENT mere (RefPersonne)>
    <!ELEMENT enfants (RefPersonne*)>

    <!ELEMENT RefPersonne EMPTY> <!-- pour attribut IDREF -->

    <!ATTLIST Personne nom CDATA #REQUIRED>
    <!ATTLIST Personne sexe CDATA #REQUIRED>

    <!ATTLIST Personne ref ID #REQUIRED>
    <!ATTLIST RefPersonne maref IDREF #REQUIRED>


    Noter l'importance des spécifications pere? et mere? pour éviter la régression généalogique à l'infini.

  5. DOM et getElementById()

    Le problème de l'identifiant unique se pose d'une autre manière pour la méthode getElementById() du modèle DOM.
    Il s'agit pour cette méthode d'avoir un attribut de nom fixé "id" dont la valeur est unique à l'échelle du document,
    c'est-à-dire de type ID au sens des DTDs. Cet attribut devrait donc être déclaré de manière adéquate dans une DTD...
    L'ennui est que les DTDs ne sont plus universellement utilisées...

    La solution est fournie par l'emploi du nom "xml:id" au lieu de "id", qui dispense de la déclaration.
    Voir
    ce qu'en dit le W3C.

IV. Les entités

  1. Idée générale

    En XML, comme en HTML (c'est un héritage de SGML), on appelle entité (anglais entity) une forme d'abréviation censée rendre les fichiers plus faciles à gérer.
    Ces  abréviations sont définies dans la DTD, et utilisées dans le fichier entre "&" et ";" :
    Exemple :  

  2. Un usage fréquent : les entités-caractères

    Elles sont bien connues en HTML depuis le temps où on croyait ne pouvoir faire circuler que des fichiers écrits en ASCII 7 bits.
    Rappelez-vous ! &eacute;, &agrave;, etc sont des entités prédéfinies en HTML.
    Depuis l'avènement d'UTF-8, leur emploi s'est considérablement restreint, aussi n'en reste-t-il qu'un tout petit nombre (5) en XML :
    &amp; &
    &apos; '
    &quot; "
    &lt; <
    &gt; >

    Mais n'oublions pas que tout caractère peut être donné par une entité dérivée de son numéro Unicode, soit en décimal, soit en hexa :
    Ce qui permet de mentionner des caractères étrangers à la page de code choisie pour son fichier.
    En effet, tout le monde n'a pas encore adopté UTF-8 !

    Rien n'interdit - c'est même recommandé - d'introduire des entités plus "parlantes" comme
    <!ENTITY care-of "&#x2105;">
    et d'écrire &care-of; au lieu de &#x2105;.

  3. Entités utilisées dans la DTD elle-même

    Les DTDs pouvant prendre des tailles considérables, on souhaite employer des abréviations du même genre dans le fichier-DTD lui-même.
    Il s'agit bien évidemment d'un mécanisme différent de celui des entités ordinaires (définies dans la DTD, donc "au niveau méta", mais utilisées dans le fichier XML, "au niveau objet").
    Dans la littérature, ces nouvelle abréviations sont appelées "entités-paramètres" (en anglais parameter entities).
    On devrait plutôt les qualifier de méta-entités.

    Elles sont caractérisées par l'apparition d'un marqueur syntaxique spécial "%" dans leur définition, qui répparaît comme préfixe dans leur utilisation. On pourrait par exemple réécrire notre DTD familiale ainsi 

    <!ENTITY % parents "pere?, mere?">
    ....
    <!ELEMENT Personne (%parents;, enfants)>

Pour plus de détails et d'exemples, voir par exemple les excellentes sources d'informations que sont SelfHTML et Commentçamarche.

V. Mise en pratique

Nous sommes à présent armés pour aller lire la DTD des documents XML du  corpus Frantext (fichier TEIFrantext.dtd).