PREVIOUS UP   Technologies Internet et Education, © TECFA
  3. Les DTD

3. Les DTD

3.1 Introduction aux DTD de XML

Note: HTML avec XML ?

3.2 Le langage pour définir une grammaire DTD

A. Prologue et déclaration de DTD

Exemple 3-1: Hello XML sans DTD

<?xml version="1.0" standalone="yes"
?>
<hello> Hello XML et hello cher lecteur ! </hello>

Exemple 3-2: Hello XML avec DTD interne

<?xml version="1.0" standalone="yes"
?>
<!DOCTYPE hello [
   <!ELEMENT hello (#PCDATA)>
   ]>
<hello> Hello XML et hello cher lectrice ! </hello>

Exemple 3-3: Hello XML avec DTD externe

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE hello SYSTEM "hello.dtd">
<hello> Hello XèMèLè et hello cher lectrice ! </hello>

B. Déclaration du DTD (interne ou externe)

  <!DOCTYPE
  >
   <!DOCTYPE hello [
       <!ELEMENT hello (#PCDATA)>
                   ]
>
<!DOCTYPE hello SYSTEM "hello.dtd">

C. Définition du DTD

3.3 Déclaration d'éléments (tags)

Eléments DTD simples

<!ELEMENT nom_du_tag spécification_contenu>

La spécification du contenu d'un élément contient soit une combinaison d'autres éléments, soit les éléments spéciaux #PCDATA, ANY, EMPTY (voir les exemples ci-après).

On peut combiner selon les règles ci-dessous:

 

A et B = tags

Explication specification_contenu

A?

A (un seul) est une option, (match A ou rien)

A+

Il faut un ou plusieurs A

A*

A est une option, il faut zero, un ou plusiers A

A | B

Il faut A ou B, mais pas les deux

A , B

Il faut A, suivi de B (dans l'ordre)

(A, B) +

Les parenthèses regroupent. Ici: un ou plusieurs (A suivi de B)

Eléments spéciaux

 

Elément spéciaux

Explication specification_contenu

#PCDATA

"Parsed Character Data"

Données (non-interprétés par XML) dans le langage d'encodage courant.

ANY

Mot clé qui indique que tous les éléments sont autorisés (déconseillé)

EMPTY

Tag sans "closing" comme <br/>

Restriction sur les identificateurs (noms)
Comprendre/lire un DTD:

Exemple 3-4: Un DTD pour un simple Address Book

<!DOCTYPE addressBook [
 <!ELEMENT addressBook (person)+>
 <!ELEMENT person (name,email*)>
 <!ELEMENT name (family,given)>
 <!ELEMENT family (#PCDATA)>
 <!ELEMENT given (#PCDATA)>
 <!ELEMENT email (#PCDATA)>
]>

Exemple 3-5: Exemple d'un arbre XML valide

<addressBook>
  <person>
    <name>  <family>Wallace</family> <given>Bob</given> </name>
    <email>bwallace@megacorp.com</email>
  </person>
 
  <person>
    <name>  <family>Tuttle</family> <given>Claire</given> </name>
    <email>ctuttle@megacorp.com</email>
  </person>
</addressBook>
 

Exemple 3-6: Exemple d'un arbre XML invalide

<addressBook>
    <address>Derrière le Salève</address>
    <person>
    <name>
      <family>Schneider</family> <firstName>Nina</firstName>
    </name>
    <email>nina@dks.com</email>
  </person>
  <name>
   <family> Muller </family> </name>
</addressBook>
 

Exemple 3-7: Un DTD pour une recette

 
<!DOCTYPE list [
 <!ELEMENT list (recipe+)>
 <!ELEMENT recipe (author, recipe_name, meal, ingredients, directions)>
 <!ELEMENT author (#PCDATA)>
 <!ELEMENT recipe_name (#PCDATA)>
 <!ELEMENT meal (#PCDATA)>
 <!ELEMENT ingredients (item+)>
 <!ELEMENT item (#PCDATA)>
 <!ELEMENT directions (#PCDATA)>
]>

Exercice 1: Lecture d'un DTD

3.4 Déclaration d'attributs

Attributs DTD simples (Voir la spec pour une définition "clean" !!):

<!ATTLIST target_tag attr_nom TypeAttribut TypeDef Defaut>

 

 

Explication de TypeAttribut

ID

Attribut unique dans le document

IDREF

Doit correspondré à un ID attribut dans un des éléments

IDREFS

Doit correspondre à 1 ou plusieurs ID attributs (séparés par des blancs)

(A,B,C,..)

Liste énumérée

CDATA

"Character Data" - Contenu arbitraire, mais normalisé:
espaces et fin de lignes convertis en un seul espace !

NMTOKEN

Un seul Mot

 

 

Explication de TypeDef

#IMPLIED

Attribut à option

#REQUIRED

Attribut nécessaire

#FIXED Value

Attribut avec valeur fixe

Illustrations:

 <!ATTLIST person gender (male|female) #IMPLIED>
 <!ATTLIST form method CDATA #FIXED "POST">
 <!ATTLIST list type (bullets|ordered) "ordered">
 <!ATTLIST sibling type (brother|sister) #REQUIRED>
Attributs DTD multiples:

<!ATTLIST target_tag

attr1_nom TypeAttribut TypeDef Defaut

attr2_nom TypeAttribut TypeDef Defaut

...

>

 

Illustrations:

 <!ATTLIST person 
	gender      (male|female)    #IMPLIED
	nom         CDATA            #REQUIRED
	prenom      CDATA            #REQUIRED
	relation    (brother|sister) #REQUIRED
 >

Exemple 3-8: Un DTD pour un moins simple Address Book

[fichier ab.dtd]

 <?xml version="1.0" encoding="UTF-8"?>
 <!ELEMENT addressBook (person)+>
 <!ELEMENT person (name,email*)>
 <!ATTLIST person id ID #REQUIRED>
 <!ATTLIST person gender (male|female) #IMPLIED>
 <!ELEMENT name (#PCDATA|family|given)*>
 <!ELEMENT family (#PCDATA)>
 <!ELEMENT given (#PCDATA)>
 <!ELEMENT email (#PCDATA)>
 <!ELEMENT link EMPTY>
 <!ATTLIST link manager IDREF #IMPLIED subordinates IDREFS #IMPLIED>
Exemple:
<!DOCTYPE addressBook SYSTEM "ab.dtd">
<addressBook>
  <person id="B.WALLACE" gender="male">
    <name>
      <family>Wallace</family> <given>Bob</given>
    </name>
    <email>bwallace@megacorp.com</email>
    <link manager="C.TUTTLE"/>
  </person>
  <person id="C.TUTTLE" gender="female">
    <name>
      <family>Tuttle</family> <given>Claire</given>
    </name>
    <email>ctuttle@megacorp.com</email>
    <link subordinates="B.WALLACE"/>
  </person>
</addressBook></pre>

3.5 Attributs vs. Elements

Il faut plutôt utiliser un élément
Il faut plutôt utiliser un attribut

3.6 Déclaration d'Entités

 

 

Explications

SYSTEM

Le contenu de l'entité est accessible par un URI

.....

......

A. Entités générales

<!ENTITY nom_du_tag "contenu">

Illustrations:

<!ENTITY tecfaUnit "Unité de technologies de formation et apprentissage"> 
<!ENTITY tecfaDesc SYSTEM "http://tecfa.unige.ch/../tecfa_description.xml"> 
Référence à une entité générale (inclusion)
  • servent partout.
  • Exemples d'entités déclarées:
<!ENTITY pm "Patrick Mendelsohn">
<!ENTITY acirc  "&#194;">
<!ENTITY espace "&#160;">
<!ENTITY copyright "&#xA9;">
<!ENTITY explication SYSTEM "project1a.xml">

Ensuite, on fait une référence du style "&nom_paramètre;":

<para> &pm; sort du ch&acirc;teau <para>
va donner:
<para> Patrick Mendelsohn sort du ch&acirc;teau,
s'arrête devant le panneau et lit:&espace;
<citation> &explication </citation>
</para>

B. Entités "paramétriques"

<!ENTITY % stamp '
  id ID #IMPLIED        
  creation-day NMTOKEN #IMPLIED
  .......
  mod-by NMTOKEN #IMPLIED
  version NMTOKEN #IMPLIED
  status (draft|final|obsolete) #IMPLIED
  approval (ok|not-ok|so-so) #IMPLIED        
  main-author CDATA #IMPLIED
'
>

Usage: on fait une référence du style "%nom_paramètre;":

<!ELEMENT main-goal (title, content, (after-thoughts)?, (teacher-comments)?)>
<!ATTLIST main %stamp; >

C. Annexe: La définition de XML

Exemple 3-9: Quelques éléments de XML à titre d'illustration

[1] document ::= prolog element Misc
[2] element  ::= EmptyElemTag | STag content ETag [WFC: Element Type Match]
                [VC: Element Valid]
 

PREVIOUS UP -- TIE