INaLCO - M2 Traductique
Introduction à XML, cours n°2

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
    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 locale
      3. Déclaration externe publique

  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

  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

    Une DTD permet essentiellement de spécifier les noms, les contenus et les attributs
    des éléments qui composent le fichier XML visé.
    • Spécification conjointe du nom et du contenu d'un élément (texte ou sommets-enfants) :
      <!ELEMENT nom (contenu)>

      le contenu pouvant être
      • une séquence d'éléments : suite de noms d'éléments séparés par des virgules
      • un choix : suite de noms d'éléments séparés par des barres verticales "|"
      • un contenu textuel : #PCDATA (Parsed Character Data), où le qualificatif
        parsed signale que le parseur XML ne s'attend pas à y trouver de balises,
        et que par conséquent la chaîne de caractères est soumise à restrictions.
      • un mélange de tout cela.

    • Spécification d'attribut (nom et type de valeur) pour un élément de nom donné :
      <!ATTLIST nomElt nomAttr type défaut>
      • le type pouvant être
        • CDATA,
        • un choix de valeurs (nécessairement des noms),
        • bien d'autres encore...
      • le défaut pouvant être
        • la valeur par défaut
          c'est-à-dire la valeur de l'attribut si aucune valeur effective n'apparaît dans le document,
          ou l'un des indicateurs
        • #REQUIRED,
        • #IMPLIED (= optionnel),
        • #FIXED valeur (valeur imposée par défaut et non modifiable par une valeur effective).
  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).
    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).

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

    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.

III. La notion de référence

  1. Problème à résoudre

    Soit à représenter une structure familiale comme :   famille
    • On ne peut pas inclure les enfants à l'intérieur des balises de leur mère...
    • Ni les parents à l'intérieur des balises des enfants...

    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 :
    • ID est le type de la référence attribuée à un élément "normal"
    • IDREF est celui de la référence mentionnée (pour citer l'élément référencé),
      ce qui ne peut se faire que dans un élément vide.

    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 :
    • leurs valeurs doivent être des noms
    • une valeur de ID ne peut apparaître qu'une seule fois dans le document
    • toute valeur qui apparaît comme IDREF doit être déclarée comme ID.

  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.

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 :
    • en décimal : &le-numéro-décimal; par exemple &#198; ---> Æ (majuscule danoise)
    • en hexadécimal : &xle-numéro-hexa; par exemple &#x2105; ---> ℅ (le signe care-of = aux bons soins de)
    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).