logo Mkadmi
Accueil            ISD            Equipe de recherche           Laboratoire Paragraphe            Enssib         ECP           Contact  

Accueil

 

 
 
 
 
   

 
 

webmaster

 
 
Les DTDs (Document Type Definition)

5- Document bien formé et document valide : DTD

  • Un document bien formé est un document respectant la syntaxe XML.
  • Un document valide est un document bien formé qui respecte une structure type définie dans une DTD.

La DTD (Document Type Definition) est un composant optionnel du prologue XML, permet de différencier la notion de document bien formé ou valide

-        Un document bien formé est conforme aux règles syntaxiques du langage XML

-        Un document valide est conforme à la grammaire définie par la DTD

On choisit d'associer une DTD à un document si l'on veut vérifier sa validité

-         La DTD permet de spécifier la structure logique d'un document

C'est le parseur XML qui fonctionne en mode validant ou non, suivant son paramétrage ou la référence à une DTD.

L'écriture d'une DTD est la transposition d'un modèle de données (type MCD Merise ou modèle d'objets UML) au format XML.

5.1 Référence à une DTD dans un document XML

< ! DOCTYPE  nom  SYSTEM  ‘nomfichier.dtd’>

Dans ce cas le fichier DTD ne contient pas la déclaration  < !DOCTYPE …>.

Exemple : le fichier xml

< ?xml version = ''1.0'' ?>

      < ?xml : stylesheet  href = ''DTDexterne.xsl''  type = ''texte/xsl'' ?>

 

      < !DOCTYPE catalogue  SYSTEM  ''DTDexterne.dtd''>

      <catalogue>

            <stage id = ''XMLPres''>

                  <intitule>XML et les bases de données</intitule>

                  <prerequis>connaître les langages SQL et HTML</prerequis>

            </stage>

            <stage id = ''XML Prog''>

                  <intitule>XML programmation</intitule>

                  <prerequis>avoir suivi le stage de XML et les bases de données</prerequis>

             </stage>

      </catalogue>

Exemple : la DTD : fichier DTDexterne.dtd

< ! ELEMENT catalogue  (stage)*>

      < ! ELEMENT stage (intitule, prerequis)>

      < ! ELEMENT intitule (#PCDATA)>

      < !ELEMENT prerequis (#PCDATA) | xref )*>

      < !- - déclaration de xref comme élément vide - ->

      < ! ELEMENT xref EMPTY>

      < !- - déclaration de l’attribut ID -->

      < ! ATTLIST stage id ID  #REQUIRED >

      < ! – déclaration de l’attribut xref de type IDREF - ->

      < ! ATTLIST xref xref IDREF  #REQUIRED >

Cependant, la définition de la DTD peut se faire dans le document XML lui même en incluant dans le prologue l’ensemble des déclarations de la DTD.

< ?xml version = ''1.0'' ?>

< ?xml : stylesheet  href = ''DTDexterne.xsl''  type = ''texte/xsl'' ?>

 

< !DOCTYPE catalogue [

< ! ELEMENT catalogue  (stage)*>

      < ! ELEMENT stage (intitule, prerequis)>

      < ! ELEMENT intitule (#PCDATA)>

      < !ELEMENT prerequis (#PCDATA) | xref )*>

      < !- - déclaration de xref comme élément vide - ->

      < ! ELEMENT xref EMPTY>

      < !- - déclaration de l’attribut ID -->

      < ! ATTLIST stage id ID  #REQUIRED >

      < ! – déclaration de l’attribut xref de type IDREF - ->

      < ! ATTLIST xref xref IDREF  #REQUIRED >

] >

<catalogue>

<stage id = ''XMLPres''>

                  <intitule>XML et les bases de données</intitule>

                  <prerequis>connaître les langages SQL et HTML</prerequis>

            </stage>

            <stage id = ''XML Prog''>

                  <intitule>XML programmation</intitule>

                  <prerequis>avoir suivi le stage de XML et les bases de données</prerequis>

</stage>

</catalogue>

5.2 Déclaration interne et externe de la DTD

Un document XML peut contenir à la fois une référence à une DTD et une déclaration interne d’élément.

Dans ce cas si un élément est déclaré dans la DTD et dans le document, c’est toujours la déclaration interne qui prévaut.

6- Les différents formats de déclaration

C’est la définition du contenu type d’un document (sa grammaire).

Il existe quatre types de déclarations :

-         Des éléments,

-         Des listes d’attributs,

-         Des entités

-         Des notations

6.1. Les éléments

Exemple

< ! ELEMENT livre (titre, editeur ?, auteur, chapitre+, prix, critique*) >

Cet exemple définit l'élément livre suivi de son modèle de contenu :

titre : information obligatoire présente une seule fois (1, 1),

editeur? : le ? signifie que cette information est facultative (0, 1),

chapitre+ : le + signifie que l'élément peut être répété (1,N),

critique* : * signifie que l'élément est facultatif et qu'il peut être répété (0,N).

Autres exemples

< !ELEMENT livre (titre, editeur ?, auteur, (titre_chapitre, corps_chapitre)+, prix, critique*) >

(titre_chapitre, corps_chapitre)+      indique que le couple (titre_chapitre, corps_chapitre) est obligatoire et peut être répété.

<ELEMENT livre (titre, editeur ?,  auteur, chapitre+, prix, critique*)>

< !ELEMENT chapitre (titre_chapitre, corps_chapitre)>

indique que l’élément chapitre est obligatoire, peut être répété et que chaque chapitre est constitué des éléments titre_chapitre et corps_chapitre dans cet ordre.

< !ELEMENT livre (titre, editeur  |  auteur, prix, critique*)>

editeur | auteur : indique que ces éléments sont obligatoires et que l’ordre est indifférent.

6.1.1. Déclaration d'un élément de données

La déclaration d'un élément fils (niveau le plus fin) se fait de la façon suivante

      < !ELEMENT  nom  (#PCDATA)>

L'élément nom peut contenir toute donnée XML (y compris des sections littérales) mais ne peut pas contenir des données non-XML.

6.1.2. Déclaration d'un élément à modèle mixte

Cette définition autorise la mixité entre données et élément.

< !ELEMENT       chapitre  (#PCDATA  | p |  exemple)* >

Un chapitre peut contenir des données (#PCDATA) et/ou un élément nomme p et/ou un élément nommé exemple. Ces éléments étant facultatifs et pouvant apparaître plusieurs fois.

6.1.3. Déclaration d'un contenu libre: ANY

Il est possible d'indiquer que le contenu d'un élément est libre (donnée ou autres éléments) en précisant le mot clé ANY

< ! ELEMENT   chapitre   ANY >

Cette déclaration peut être très pratique en phase de conception car elle permet de définir des structures et de les affiner au fur et à mesure de l'avancement du projet.

6.1.4 Déclaration d'un Elément vide

< !ELEMENT chapitre  EMPTY>

6.2 Exemple récapitulatif

Exemple 1 : DTD d’un ouvrage

      < ! DOCTYPE article [

                  < ! ELEMENT article (topic)* >

< ! ELEMENT  titre (#PCDATA) >

< ! ELEMENT editeur (#PCDATA) >

< ! ELEMENT auteur (#PCDATA) >

< ! ELEMENT prix (#PCDATA) >

< ! ELEMENT pages (#PCDATA) >

      ] >

 

 Exemple 2 : DTD d’un catalogue de formation

      < ! DOCTYPE catalogue [

                  < ! ELEMENT catalogue (stage) * >

                  < ! ELEMENT stage (intitule, duree, population, objectif, desc_jour+) >

                  < ! ELEMENT desc_jour (num ?, desc, tp*) >

      < ! ELEMENT intitule (#PCDATA | p)* >

      < ! ELEMENT duree (#PCDATA) >

      < ! ELEMENT population (#PCDATA) >

      < ! ELEMENT objectif (#PCDATA | p)* >

      < ! ELEMENT num (#PCDATA) >

      < ! ELEMENT desc (#PCDATA | p)* >

      < ! ELEMENT tp (#PCDATA | p)* >

      < !-- déclaration de l’élément paragraphe -->

      < ! ELEMENT  p  (#PCDATA)>

] >

6.3 la liste d’attributs

Comme cela été vu au chapitre sur la syntaxe XML, un attribut est un couple nom=valeur. La définition des attributs dans une DTD va permettre de spécifier les attributs qui pourront ou devront être associés à un élément, et éventuellement leurs valeurs par défaut.

Cette déclaration se fait par : < !ATTLIST nom-élément déclaration-attribut>

La déclaration d'attributs peut être répétée et se fait sous la forme suivante :

nom-attribut type valeur-défaut

Six types d'attributs sont reconnus :

CDATA

pour indiquer que la valeur de l'attribut est une séquence de caractères (y compris des entités de caractères)

ID

pour indiquer que la valeur de l'attribut est un symbole commençant par une lettre et ne contenant que des lettres, des chiffres, ou les caractères - _ : et . (la valeur doit être unique sur l'ensemble d'un document)

IDREF

pour indiquer que la valeur de l'attribut est un symbole défini comme valeur de l'attribut ID d'un autre élément de document

IDREFS

comme IDREF, mais plusieurs valeurs séparées par des espaces sont autorisées

ENTITY
ENTITIES
NMTOKEN
NMTOKENS

pour utilisateurs avancés (pas abordés dans le cadre de ce cours)

énumération

une énumération de valeurs possibles se fait en mettant entre parenthèses les valeurs séparées par des |. Exemple:

<!ATTLIST TD
  valign (top|middle|bottom|baseline) #IMPLIED
  ... >

Et il existe 4 valeurs par défaut :

Le symbole prédéfini #IMPLIED

indique que l'application traitant le document fournira la valeur par défaut

Le symbole prédéfini #REQUIRED

indique l'auteur du document doit définir l'attribut en question

Le symbole prédéfini #FIXED suivi d'une valeur (chaîne de caractères entre guillemets)

indique que l'attribut ne peut prendre que la valeur mentionnée

Une des valeurs d'une énumération, ou une chaîne de caractères compatibles avec le type associé à l'attribut

indique qu'en l'absence d'indication explicite, l'attribut prendra la valeur indiquée ici

6.4 les entités paramètres

Les entités paramètres sont identiques sur le principe aux entités internes. Cependant une entité paramètre n’est référençable qu’à l’intérieur même de la DTD où elle est déclarée.

< !ENTITY   %  nom  'valeur' >

Exemple

      < !ENTITY  % Fr  'Franc' >

      < !ENTITY  % Eu  'Euro' >

      < !ATTLIST PRIX  unite (% Fr ;  | %Eu ;)  ''%Eu ; '' >

6.5 Les sections internes et externes

Le découpage des DTD en sections permet de mettre en œuvre un découpage modulaire de la déclaration. Dans la pratique, une DTD est fréquemment composée d’une déclaration incluant toutes les structures (éléments, attributs, entités) spécifiques à l’auteur, et de liens à des déclarations externes incluant les structures types communes à plusieurs documents.

Exemple : Fichier sectionExterne.dtd

      < !ELEMENT catalogue (stage)* >

      < !ELEMENT stage (intitule, description, session*) >

      < !ELEMENT intitule (#PCDATA) >

      < !ENTITY % planning SYSTEM « planning.dtd » >

      %planning ;

Exemple : Fichier planning.dtd

      < !ELEMENT session (debut, fin) >

      < !ELEMENT debut (#PCDATA) >

      < !ELEMENT fin (#PCDATA) >

Exemple : Fichier SectionExterne.xml

    < ?xml version=  « 1.0 » encoding  « ISO-8859-1 » ?>

      < ?xml : stylesheet href=  « SectionExterne.xsl » type=  « text/xsl » ?>

      < !DOCTYPE catalogue SYSTEM « SectionExterne.dtd »>

      <catalogue>

                  <stage>

                             <intitule>XML – Présentation</intitule>

                             <description>exemple</description>

                             <session>

                                         <debut>15/11/2002</debut>

                                         <fin>13/12/2002</fin>           

                             </session>      

                             <session>

                                         <debut>10/01/2003</debut>

                                         <fin>19/04/2003</fin>           

                             </session>      

                  </stage>

                  <stage>

                             <intitule>XML et bases de données</intitule>

                             <description>exemple</description>

                  </stage>

      </catalogue>

7- Les domaines de noms (namespaces)

Un des objectifs de XML est l'interopérabilité. Pour cela on suppose que chacun doit essayer de s'appuyer sur des DTD standards afin de faciliter la compréhension des structures de documents.

Il est donc courant d'utiliser plusieurs DTD pour construire un document XML.

Des conflits de noms peuvent alors survenir si deux éléments portent des noms identiques dans deux DTD différentes (par exemple fn=fonction dans MathML, fn=foot notes dans Basic-Text).

Pour éliminer ces conflits de noms, on a recours aux domaines de noms (ou appelés aussi espaces de nommage). Le principe consiste préfixer chaque nom d'élément par un nom qui identifie le domaine auquel il fait référence (par exemple math:fn pour l'élément mathématique fn et text:fn pour l'élément bas de page).

Les avantages de cette structuration :

• Les espaces de noms permettent de lever les ambiguïtés sur des éléments de DTD différentes qui porteraient le même nom (nom de produit, nom de personne, ..),

• Les espaces de noms favorisent la modularité des documents XML et les sources multiples de ces derniers,

• Les espaces de nom permettent, indirectement, de rendre plus lisible un document XML contenant des informations de sources diverses.

Les Namespaces ont un statut de recommandation du 14 Janvier 1999, dont les spécifications sont disponibles à:

http://www.w3.org/TR/1999/REC-xml-names-19990114

Un espace de noms est déclaré à l'aide de l'attribut xmlns :

Soit en déclarant l'espace de nom dans l'élément :

<ElementDuDocument xmlns=UriDTDaImporter">

Exemple d’utilisation sans préfixe

<seminaire xmlns="http://www.unilog.fr/seminaire">

Soit en associant un préfixe pour une utilisation plus fine :

<ElementDuDocument xmlns:Préfixe='UriDTDalmporter">

Exemple d’utilisation avec préfixe

<seminaire  xmlns :sem="http://www.unilog.fr/seminaire">                   

….

<sem :date/>

Quand on déclare plusieurs espaces de noms, l'espace de nom par défaut est celui sans préfixe.

La portée d'une déclaration est limitée au sous-arbre dans lequel la déclaration a été faite.

 
Accueil            ISD            Equipe de recherche           Laboratoire Paragraphe            Enssib         ECP           Contact