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
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 :
Exemple
d’utilisation sans préfixe
<seminaire
xmlns="http://www.unilog.fr/seminaire">
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.
|