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

3. Les DTD

3.1 Introduction aux DTD de XML

Une DTD est une grammaire qui definit:

  1. 1. les balises (tags) possibles et leurs attributs
  2. 2. L'imbrication des balises à l'intérieur d'autres balises
  3. 3. Quels balises et attributs sont à option et lesquels sont obligatoires

Chaque balise XML est défini une seule fois comme un élément dans la DTD

<!ELEMENT title (#PCDATA)>

3.2 Association d'une DTD avec un fichier XML

A. Déclaration d'une DTD dans un fichier XML

Exemple:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE hello SYSTEM "hello.dtd">

Il existe 4 façons d'utiliser une DTD

  1. On ne déclare pas de DTD (dans ce cas le fichier est juste "bien formé")
  2. On déclare la DTD et on y ajoute les définitions dans le même fichier (DTD interne)
    • On parle dans ce cas d'un XML "standalone" (le fichier XML se suffit à lui-même)
  3. On déclare la DTD en tant que DTD "privée", la DTD se trouve quelque part dans votre système ou sur Internet
    • répandu pour les DTDs "faites maison"
  4. On déclare une DTD "public", c.a.d. on utilise un nom officiel pour la DTD.
    • cela présuppose que votre éditeur et votre client connaissent cette DTD
    • répandu pour les DTDs connues comme XHTML, SVG, MathML, etc.

Lieu de la déclaration

  • La DTD est déclarée entre la déclaration de XML et le document lui-même.
  • La déclaration de XML et celle de la DTD font parti du prologue
    • (qui peut contenir d'autres éléments comme les processing instructions)
  • Attention: l'encodage de la DTD doit correspondre à celui des fichiers XML !

B. Syntaxe de la déclaration

  <!DOCTYPE
  >
   <!DOCTYPE hello [
       <!ELEMENT hello (#PCDATA)>
                   ]
>

<!DOCTYPE hello SYSTEM "hello.dtd">

C. Définition de la racine de l'arbre

<!DOCTYPE hello SYSTEM "hello.dtd">

Quelques exemples:

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 chère 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>

Exemple 3-4: Un fichier RSS (DTD externe public)

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
 "http://my.netscape.com/publish/formats/rss-0.91.dtd">
<rss version="0.91">
<channel> ...... </channel> 
</rss>

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

Rappel du principe:

Exemple de sensibilisation:

<!ELEMENT name (family,given)>
<!ELEMENT family (#PCDATA)>

veut dire que:

En utilisant un "schéma":

name 		==> 	family + given
family 		==> "texte"

Syntaxe de la définition d'un élément:

<!ELEMENT nom_balise spécification_contenu>

La spécification du contenu d'un élément contient:

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

 

A et B = tags

Explication specification_contenu

Exemples

A?

A (un seul) est une option,

(donc: A ou rien)

<!ELEMENT person (name,email?
)

A+

Il faut un ou plusieurs A

<!ELEMENT person (name,email+
)

A*

A est une option, il faut zèro, un ou plusieurs A

<!ELEMENT person (name,email*
)

A | B

Il faut A ou B, mais pas les deux

<!ELEMENT person (email | fax
)

A , B

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

<!ELEMENT person (name ,email?
)

(A, B) +

Les parenthèses regroupent.

Ici: un ou plusieurs (A suivi de B)

<!ELEMENT liste (
name,email)+

Eléments spéciaux

 

Elément spéciaux

Explication specification_contenu

Exemples

#PCDATA

"Parsed Character Data"

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

<!ELEMENT email (#PCDATA)>
 

ANY

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

<!ELEMENT person ANY>
 

EMPTY

Balise auto-fermante comme dans <br/>

<!ELEMENT br EMTPY>

Restriction sur les identificateurs (noms)

Comprendre/lire une DTD:

Exemple 3-5: Une DTD pour un simple Address Book

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

Exemple 3-6: 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-7: 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>
 

Question:

  • quelles sont les erreurs? (il y en a trois)

Exemple 3-8: Une DTD pour une recette

 

 <!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'une 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 TypeDef

#IMPLIED

Attribut à option (l'utilisateur peut l'utiliser)

#REQUIRED

Attribut obligatoire (l'utilisateur doit rentrer une valeur)

#FIXED Value

Attribut avec valeur fixe (la valeur est déjà fixée dans la DTD)

Illustrations:

<!ATTLIST person prenom CDATA #REQUIRED>
<!ATTLIST person gender (male|female) #IMPLIED>
<!ATTLIST form method CDATA #FIXED "POST">
<!ATTLIST list type (bullets|ordered) "ordered">
<!ATTLIST sibling type (brother|sister) #REQUIRED>
<!ATTLIST person id ID #REQUIRED>
 

Attributs DTD multiples:

<!ATTLIST target_tag

attr1_nom TypeAttribut TypeDef Defaut

attr2_nom TypeAttribut TypeDef Defaut

...

>

 

Illustrations:

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

Exemple 3-9: Une DTD pour un Address Book plus complexe

[contenu du 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 d'un XML valide par rapport aux règles dans ab.dtd:

<!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>

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

Seulement 5 entités sont prédéfinies (toutes pour les signes spéciaux)

Entity

Signe

&amp;

&

&lt;

<

&gt;

>

&quot;

"

&apos;

'

Les autres entités doivent être définies par l'auteur de la DTD

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">
<!ENTITY pm "Patrick Mendelsohn">
<!ENTITY acirc  "&#194;">
<!ENTITY espace "&#160;">
<!ENTITY copyright "&#xA9;">
<!ENTITY explication SYSTEM "project1a.xml"> 

Référence à une entité générale (simple substitution)

<para> &pm;
 sort du ch&acirc;teau, s'<para>

va donner:

<para> Patrick Mendelsohn sort du ch&#194;teau</para>

Inclusion d'un contenu d'un autre fichier:

<para> blabla
<citation> &explication;
 </citation>
.... </para>

va donner:

<para> blabla
<citation> .... tout le contenu du fichier project1a.xml...
 </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: Les listes d'attributs ci-dessous contient tous les attributs définis dans l'entité %stamp;

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

Exemple 3-10: Exemple DTD avec entités incluses dans une DTD

Voici montré avec un exemple:

<! ENTITY % foreign-dtd SYSTEM "ibtwsh6_ePBL.dtd" >
%foreign-dtd;
<!ELEMENT introduction %vert.model
;>
<!ELEMENT introduction %struct.model;
>
<!ELEMENT conclusion %struct.model;>

Activité:

C. Annexe: La définition de XML

Exemple 3-11: 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]

UP PREVIOUS NEXT -- TIE