Un document XML est composé d'éléments, i.e. de blocs qui représentent la structure logique du document. Le document contient à la fois l'information (par exemple du texte) et des méta-informations (information sur l'information, sous forme d'éléments). Ces éléments peuvent être :
<titre>Mort sur le Nil</titre>
<HR/>
ou encore <HR></HR>
Chaque élément présente des
caractéristiques appelées attributs :
<titre type="policier">Mort sur le Nil</titre>
Une DTD, Document Type Definition, définit les éléments et les règles d'utilisation (noms des éléments, attributs possibles pour un élément, imbrications). Cependant des documents XML peuvent ne pas avoir de DTD. Si un document est associé à une DTD et qu'il se conforme à cette DTD, il est dit valide. S'il n'a pas de DTD et qu'il suit les règles définies par XML (par exemple : ses éléments sont correctement imbriqués), il est bien formé. Le document ne contient aucune information concernant l'affichage, c'est sa feuille de style qui définira la présentation sur un média.
<HTML>
... </HTML>
) ;<P> <EM> ... </EM> </P>
) ;<
pour <
) ;& <
> ' et "
;Les DTDs définissent les éléments et les règles d'utilisation : noms des éléments, attributs possibles pour un élément, imbrications.
Non, un document XML peut ne pas avoir de DTD. Un tel document définit son propre balisage de manière informelle. Il doit cependant être bien formé. Lorsqu'aucune DTD n'est utilisée, le document doit préciser dans la déclaration XML qu'il est autonome (Standalone Document Declaration ou SDD).
Voici un document XML qui donne les titres de livres d'une bibliothèque, le nom de l'auteur et la référence du livre.
<?xml version="1.0" standalone="yes"?>
<bibliotheque>
<livre>
<titre>N ou M</titre>
<auteur>Agatha Christie</auteur>
<ref>Policier-C-15</ref>
</livre>
<livre>
<titre>Le chien des Baskerville</titre>
<auteur>Sir Arthur Conan Doyle</auteur>
<ref>Policier-D-3</ref>
</livre>
<livre>
<titre>Dune</titre>
<auteur>Franck Heckbert</auteur>
<ref>Fiction-H-1</ref>
</livre>
</bibliotheque>
<?xml version="1.0" [encoding = "encodage"] [standalone = "yes"|"no"] ?>
Cette déclaration (qui est en fait une instruction de traitement, voir plus loin) contient des informations pour le processeur. Elle indique que ce document est conforme à la version 1.0 de la norme XML. Elle peut préciser le jeu de caractères utilisés dans le document (encoding) et s'il y a des références externes ou non (standalone).
<!DOCTYPE element_racine SYSTEM|PUBLIC [nom] uri_DTD>
<!DOCTYPE element_racine SYSTEM "uri_DTD">
<!DOCTYPE element_racine PUBLIC "nom" "uri_DTD">
DOCTYPE
permet de déclarer le type du document, le
nom de l'élément racine est précisé. SYSTEM
indique que la DTD est stockée sur l'ordinateur ou le web à
l'adresse précisée. PUBLIC
est utilisé quand la DTD est publiée pour beaucoup de
personnes, dans ce cas le processeur XML peut utiliser le nom pour retrouver cette DTD
(par exemple une DTD publiée par le W3C), en cas d'échec il utilise l'URI.
DOCTYPE
.
<!DOCTYPE librairie [
<!ELEMENT livre (titre, auteur, editeur..., commentaire?)>
<!ELEMENT titre (#PCDATA)>
...
<!ELEMENT commentaire (#PCDATA)>
]>
Les instruction de traitement ou PI (processing instruction)
permettent aux développeurs de placer des informations
spécifiques pour une application à l'intérieur du document. Ces
informations seront transmises à l'application. Elles ont la forme :
<?Application instruction+?>
On peut les utiliser dans n'importe quelle partie du document cependant
elles sont en général placées dans le prologue.
Par exemple, pour qu'un navigateur puisse visualiser un document XML avec une feuille de style CSS
on utilisera l'instruction de traitement : <?xml-stylesheet
type="text/css" href="ma_feuille_de_style.css"?>
.
<HTML>
<HEAD>
<TITLE>essai</TITLE>
</HEAD>
<BODY>
<P>paragraphe <EM>important</EM> du document essai</P>
<P>paragraphe normal du document essai</P>
</BODY>
</HTML>
Balise racine HTMLIl y a des parents, des enfants, des frères. HTML est le parent des éléments HEAD et BODY qui sont des frères. EM est un enfant de P qui est un enfant de BODY. Le document a donc une structure logique. L'élément document est l'élément racine qui contient tous les autres éléments et données du document (par exemple <HTML>...</HTML>).
|
|________ HEAD
| |
| |____ TITLE
|
|
|_______ BODY
|
|____ P
| |
| |____ EM
|
|____ P
Un élément non vide est constitué de trois
parties, une balise
ouvrante qui peut contenir des attributs, un contenu (des donnés
et/ou d'autres éléments) et une balise fermante. Les
éléments vides ne contiennent ni texte, ni autres
éléments, ils peuvent avoir des attributs. Un nom
d'élément doit commencer par une lettre ou un
souligné, il peut comporter des chiffres, des lettres, des traits d'union, des
points, double-points ou soulignés. Il faut noter que les
éléments sont sensibles à la casse, l'exemple
ci-après est illégal :
<titre>...</TITRE>
Un nom d'élément peut être divisé en
deux parties : domaine_de_nom:nom_element
. Par exemple, xsl:template
indique que l'élément template fait partie de xsl.
L'utilisation des domaines de noms n'est pas obligatoire, mais
cela permet d'éviter les collisions lorsqu'on fusionne des
éléments de mêmes domaines d'activité provenant de différentes sources. Les
espaces de noms sont déclarés dans le document avec
l'attribut xmlns:id, l'url permet de donner un domaine de nom par défaut
(il peut y avoir plusieurs attributs de domaines de noms dans
l'élément)
<element xmlns:prefixe=uri>
La portée est limitée à l'élément
(si on le place dans la racine = tout
le document). Mais on peut rencontrer dans les éléments
inclus une autre déclaration de domaine de noms avec un préfixe
identique, il remplace alors le précédent. Le préfixe permet
d'associer un nom à un domaine de noms (utilisé quand
il y a plusieurs domaines de noms dans l'élément parent).
<pref:element>...</pref:element>
propriete = "valeur"
ou propriete = 'valeur'
.
Les attributs peuvent être facultatifs ou obligatoires, ils donnent
des informations supplémentaires sur les éléments. Ils
apparaissent uniquement dans la balise ouvrante d'un élément.
Sa valeur indique le langage de l'élément. Cette
valeur est un code de langue ISO 639 (en minuscules) : fr, en,
it,...
suivi s'il y a des variantes pour la langue d'un tiret et
d'un code de pays ISO 3166 (en majuscules).
<xml:lang="en-US">
Sa valeur indique si un espace blanc à l'intérieur
d'un élément est significatif et ne doit pas être altéré par le
processeur XML. Avec default
le processeur XML est libre de faire ce qu'il veut avec les espaces. Si
un élément doit se comporter comme le <pre> de HTML,
il faut utiliser preserve
.
&nom_entite;
. Les caractères
réservés de XML sont remplacés par des
entités internes. Ces caractères sont les mêmes
qu'en HTML : & < > " '
.
Les entités qui permettent de les représenter sont respectivement &
< > " '
.
Tous les caractères peuvent être remplacés par une
entité qui donne leur code &#code_car;
(par exemple A
pour le caractère A).
Vous pouvez si vous le souhaitez définir vos propres entités
par le biais de la DTD. La déclaration suivante :
<!ENTITY deg "°">
il fait 25°C
qui s'affichera :Les entités externes ne sont pas contenues dans le document courant, le processeur XML ignore le contenu de l'entité et le transmet à l'application. Les entités non parsées peuvent être utilisées pour les fichiers images, les fichiers sons, les fichiers vidéo... Elles sont appelées comme valeur d'un attribut (comme en HTML on avait le chemin de l'image comme valeur de l'attribut src de l'élément img). Dans un document XML, l'attribut doit être déclaré de type ENTITY dans la DTD et la déclaration d'entité doit spécifier une NOTATION déclarée. Voici un extrait de DTD qui définit plage comme une notation JPEG et l'utilise comme valeur de l'attribut source de l'élément vide image.
<!-- extrait de la DTD -->
<!NOTATION JPEG SYSTEM "Joint Photographic Experts Group">
<!ENTITY plage SYSTEM "plage.jpg" NDATA JPEG>
<!ATTLIST image source ENTITY #REQUIRED>
<!-- appel dans le document -->
<image source="plage"/>
XML prend mieux en charge les caractères accentués que HTML où on utilise des appels d'entités (par exemple : é pour é). Les spécifications XML indiquent que tous les processeurs XML doivent accepter les codages UTF-8 et UTF-16 de la norme ISO 10646 qui couvre la plupart des langages humains. Quelques standards d'encodage :
L'encodage se précise dans la déclaration xml :
<?xml version="1.0" encoding="UTF-16"?>
Tous les ordinateurs peuvent ne pas prendre en charge le jeu de
caractères avancé, le dénominateur commun reste l'ASCII.
<!-- commentaire -->
Les commentaires sont autorisés dans le document (après
le prologue). Ils peuvent inclure n'importe quel type de données
sauf le --
, ils ne peuvent pas apparaître à
l'intérieur des balises : <p <!-- balise ouvrante de paragraphe --> >
est illégal. Le processeur ne les transmet pas
forcément à une application.
La définition de type de document (Document Type Definition) précise la grammaire de l'application XML. Elle décrit :
Rappelons qu'il n'est pas nécessaire de créer une DTD pour écrire un document XML.
Un document peut avoir une DTD externe ou une DTD interne ou encore une DTD interne et une DTD externe. Pour un document la DTD totale est la réunion du sous-ensemble externe et du sous-ensemble interne.
Le sous ensemble externe contient les déclarations générales, utiles à un ensemble de documents :
Le sous-ensemble interne contient les déclarations spécifiques au document :
La déclaration de type de document s'effectue dans le
prologue avec la déclaration DOCTYPE
qui permet de
donner un sous-ensemble interne et externe.
<!DOCTYPE racine SYSTEM|PUBLIC "url"
[ sous_ensemble_interne ]
>
Le sous-ensemble interne de la DTD est placé dans le DOCTYPE
après la déclaration XML. L'attribut standalone
prendra dans la déclaration XML la valeur "yes"
s'il n'y a pas à rechercher de DTD externe, "no"
sinon.
<?xml version="1.0" standalone="yes">
<!DOCTYPE racine [
<!-- sous-ensemble de DTD interne -->
]>
<racine>
...
</racine>
DOCTYPE
après la déclaration XML. L'attribut standalone
prendra dans la déclaration XML la valeur "no"
.
<!DOCTYPE racine (SYSTEM "url") | (PUBLIC "identifiant_public" "url"?)>
PUBLIC
est utilisé lorsque la DTD est une norme
ou qu'elle est enregistrée sous forme de norme ISO par l'auteur.
identifiant_public
contient les
caractéristiques :
type_enregistrement // proprietaire // DTD description // langueavec :
L'adresse du fichier décrivant la DTD n'est pas obligatoire, le processeur XML peut utiliser les informations de l'identifiant public pour essayer de générer une adresse. Il faut noter cependant qu'il n'est pas toujours possible de trouver l'adresse à partir de l'identifiant, il est donc conseillé de faire suivre l'identifiant par l'adresse du fichier.
Voici la déclaration de type de document pour un document html qui utilise la DTD XHTML1.0 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
SYSTEM
est utilisé pour donner l'adresse du
fichier qui contient la DTD dans le cas où la DTD n'est pas
publique.
<!DOCTYPE racine SYSTEM "http://www.serveur.fr/racine.dtd">
Rappelons qu'un élément permet de structurer le document (par exemple, livre est un élément d'un document bibliothèque, en HTML p, h1, form... sont des éléments).
La déclaration d'éléments est de la forme :
<!ELEMENT nom_element modele_de_contenu>
<!ELEMENT nom_element EMPTY>Par exemple, dans la DTD de XHTML 1.0, l'élément img est déclaré :
<!ELEMENT img EMPTY>
Un élément non vide est formé d'une balise ouvrante, d'un contenu et d'une balise fermante. Pour décrire ce contenu dans la DTD on utilise un modèle de contenu dans la déclaration d'éléments.
Si l'élément contient uniquement des données
(autrement dit, s'il n'y a aucun autre élément inclus dans cet
élément) on utilise le type #PCDATA
qui
signifie Parsed Character DATA, i.e. données
caractères analysées :
<!ELEMENT nom_element (#PCDATA)>
Par exemple, dans la DTD de XHTML 1.0, l'élément title
qui permet de donner le titre de la fenêtre est
déclaré : <!ELEMENT title (#PCDATA)>
Si l'élément contient uniquement d'autres éléments, le modèle de contenu définit les éléments pouvant être inclus dans un élément donné et spécifie également les éléments devant apparaître obligatoirement, leur ordre et leur fréquence.
Les parenthèses dans la déclaration
d'élément introduisent les
éléments enfants de l'élément
défini. L'ordre dans lequel les éléments
sont précisés est l'ordre dans lequel ils doivent
apparaître dans
l'élément en cours de définition.
Par exemple, dans la DTD de XHTML 1.0 l'élément racine
html qui
contient les éléments head et body est
déclaré <!ELEMENT html (head, body)>
.
Les indicateurs d'occurrences sont les suivants :
<!ELEMENT ul (li)+>
Pour indiquer des choix, il est possible d'utiliser le |. Dans la
DTD XHTML1.0 l'élément dl est déclaré :
<!ELEMENT dl (dt|dd)+>
<!ELEMENT
object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
<!ELEMENT nom_element ANY>
<!ELEMENT bibliotheque (livre)+>
<!ELEMENT livre (titre, auteur, ref)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT ref (#PCDATA)>
Avec une DTD interne le document XML serait le suivant :
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <!DOCTYPE bibliotheque [ <!ELEMENT bibliotheque (livre)+> <!ELEMENT livre (titre, auteur, ref)> <!ELEMENT titre (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT ref (#PCDATA)> ]> <bibliotheque> <livre> <titre>N ou M</titre> <auteur>Agatha Christie</auteur> <ref>Policier-C-15</ref> </livre> <livre> <titre>Le chien des Baskerville</titre> <auteur>Sir Arthur Conan Doyle</auteur> <ref>Policier-D-3</ref> </livre> <livre> <titre>Dune</titre> <auteur>Franck Heckbert</auteur> <ref>Fiction-H-1</ref> </livre> </bibliotheque>Avec la même DTD mais externe, on aurait alors dans le fichier externe
biblio.dtd
:
<!ELEMENT bibliotheque (livre)+>et dans le document XML :
<!ELEMENT livre (titre, auteur, ref)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT ref (#PCDATA)>
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <!DOCTYPE bibliotheque SYSTEM "biblio.dtd"> <bibliotheque> <livre> <titre>N ou M</titre> <auteur>Agatha Christie</auteur> <ref>Policier-C-15</ref> </livre> <livre> <titre>Le chien des Baskerville</titre> <auteur>Sir Arthur Conan Doyle</auteur> <ref>Policier-D-3</ref> </livre> <livre> <titre>Dune</titre> <auteur>Franck Heckbert</auteur> <ref>Fiction-H-1</ref> </livre> </bibliotheque>
Le rôle de la déclaration d'attributs est de donner pour un élément cible :
<!ATTLIST element_cible nom_attribut type_attribut
valeur_par_défaut>
La valeur par défaut est la valeur prise par l'attribut si aucune valeur n'est précisée dans l'élément. Cette valeur doit être du même type que celui donné à l'attribut. S'il n'y a pas matière à définir une valeur par défaut on peut remplacer par un mot-clé :
Par exemple, dans la DTD XHML1.0 on a pour l'élément pre
l'attribut xml:space
qui est fixé à preserve
pour signifier que les espaces blancs à l'intérieur de pre
sont significatifs et ne doivent pas être modifiés par le
processeur XML :
<!ATTLIST pre
%attrs;
xml:space (preserve) #FIXED 'preserve'
>
<!ATTLIST element_cible nom_attribut CDATA
valeur_par_défaut>
Pour XHTML1.0 les attributs http-equiv, name, content, scheme
de l'élément meta
sont des chaînes de
caractères :
<!ATTLIST meta
%i18n;
http-equiv CDATA #IMPLIED
name CDATA #IMPLIED
content CDATA #REQUIRED
scheme CDATA #IMPLIED
>
<!ATTLIST element_cible nom_attribut (val1 | val2 | ... | valN) "valdefaut">
L'attribut prend une valeur dans la liste des valeurs possibles définies dans la déclaration d'attribut (chaque valeur doit être un atome nominal ou NMTOKEN valide).
<!ATTLIST livre type (policier | fiction | aventure) "policier">
<!ATTLIST element_cible nom_attribut NMTOKEN "valdefaut">
<!ATTLIST element_cible nom_attribut NMTOKENS "valdefaut">
Les types NMTOKEN/NMTOKENS représentent des noms XML/listes
de noms XML séparés par des espaces. Ces noms peuvent être
composés de lettres, chiffres, soulignés, points, deux-points et tirets (par exemple
l'attribut name
de l'élément map
est de type NMTOKEN en XHTML1.0).
<!ATTLIST mots_cles val NMTOKENS #REQUIRED >
<mots_cles val=" begin end while do if then else"/>
<!ATTLIST element_cible nom_attribut ID>
<!ATTLIST element_cible nom_attribut IDREF>
<!ATTLIST element_cible nom_attribut IDREFS>
Un attribut de type ID représente un identificateur unique d'élément, i.e. un attribut dont la valeur distingue l'élément de tous les autres dans le document XML courant (par exemple, l'attribut id en HTML). Notons que cet attribut prend généralement le nom id.
Les types IDREF et IDREFS sont des références/listes de
références séparées par des espaces, à un identifiant unique
précédemment déclaré
(par exemple, l'attribut header
de
l'élément td
en XHML est de type IDREFS
pour indiquer à quelles cellules de l'en-tête du tableau
se rapporte la cellule courante).
Les types ENTITY et ENTITIES représentent un nom / une liste de noms d'entités séparées par des blancs, non-XML précédemment déclarées dans la DTD.
C'est utilisé par exemple pour établir un lien avec une image :
<!ATTLIST image source ENTITY #REQUIRED>
Si une liste de valeurs est préfixée par le mot
NOTATION les
notations listées comme des valeurs possibles doivent toutes
avoir déjà
été déclarées :
<!ATTLIST image type NOTATION(GIF | JPEG | PNG) "GIF">
Chaque entité XML est définie dans une DTD. Les entités spécifiques au document sont présentes dans sa DTD interne (images, autres documents non XML, caractères spécifiques). Une entité est un alias associant un nom à un groupe de données. Ces données peuvent prendre un ou plusieurs formats.
<!ENTITY % nom "chaîne_de_remplacement">
Ces entités apparaîssent uniquement dans les DTD. Ce sont des raccourcis vers des parties de déclarations de la DTD.
Par exemple dans la DTD de XHML1.0 on a la déclaration
d'entité :
<!ENTITY % Shape "(rect|circle|poly|default)">
qui est ensuite utilisée dans la déclaration d'attributs
pour l'élément area
:
<!ATTLIST area
%attrs;
shape %Shape; "rect"
coords %Coords; #IMPLIED
href %URI; #IMPLIED
nohref (nohref) #IMPLIED
alt %Text; #REQUIRED
tabindex %Number; #IMPLIED
accesskey %Character; #IMPLIED
onfocus %Script; #IMPLIED
onblur %Script; #IMPLIED
>
<!ENTITY nom "&#code;">
Ces entités associent un alias à un caractère
non disponible sur le clavier, dans le document l'appel s'effectue avec
&nom;
.
Rappelons que les caractères réservées &,
<, >, " et ' sont
déjà définis et n'ont pas à être
redéfinis par des entités dans la DTD
<!ENTITY exist "∃"> <!-- there exists, U+2203 ISOtech -->
<!ENTITY delta "δ"> <!-- greek small letter delta, U+03B4 ISOgrk3 -->
<!ENTITY nom "texte">
Transforme l'alias (nom) en une phrase incluse dans la déclaration de l'entité. C'est l'équivalent d'une macro.
Par exemple <!ENTITY wysiwyg "What You See Is What You
Get">
permet d'utiliser dans le document XML :
les éditeurs de type &wysiwyg;
, ce qui
deviendra dans un navigateur : les éditeurs de type What
You See Is What You Get
.
<!ENTITY nom SYSTEM "URI">
Les fichiers contenant des données textuelles sont analysés. Par exemple un livre peut être constitué des documents toc.xml, chapters/c1.xml, chapters/c2.xml et index.xml :
<!DOCTYPE book SYSTEM "book.dtd"
[
<!ENTITY toc SYSTEM "toc.xml">
<!ENTITY chap1 SYSTEM "chapters/c1.xml">
<!ENTITY chap2 SYSTEM "chapters/c2.xml">
<!ENTITY index SYSTEM "index.xml">
]>
<book>
<head>&toc;</head>
<body>
&chap1;
&chap2;
&index;
</body>
</book>
<!ENTITY nom SYSTEM "URI" NDATA type_notation>
Les entités externes non analysées permettent de déclarer un contenu non XML dans le document XML (fichiers binaires images, sons...). Le mot clé NDATA (Notation DATA) précise le type d'entité non analysée que le processeur XML doit traiter.
Par exemple, la déclaration d'entité<!ENTITY
vacances SYSTEM "images/plage.gif" NDATA GIF89a>
attribue un
alias (vacances) à une entité (images/plage.gif) de type
vvvvGIF89a sauvegardée sur le disque (SYSTEM).
Les fichiers binaires (images, sons...) doivent être
identifiés par une
notation qui a été déclarée dans la DTD. Par
exemple, la notation GIF89a utilisée dans l'exemple
précédent est déclarée dans la DTD :
<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics
Interchange Format 89a//EN">
Les entités binaires ne peuvent être appelées que dans la valeur d'un attribut, lui-même déclaré comme étant du type ENTITY ou ENTITIES dans la DTD. La DTD comportera donc :
<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics Interchange Format 89a//EN">ce qui permettra dans le document XML d'appeler l'image :
<!ATTLIST image source ENTITY #REQUIRED>
<!ENTITY vacances SYSTEM "images/plage.gif" NDATA GIF89a>
<image source="vacances">
<!ENTITY vacances SYSTEM "plage.gif NDATA GIF89a">qui sera utilisé dans le document XML :
<image source="vacances"/>
<!NOTATION nom_notation SYSTEM "">
Les notations permettent d'identifier par un nom le format des entités non-analysées par le parseur XML. Elles permettent de définir le format des données et les applications qui permettent de les traiter.
Si le système prend en charge le format, il est possible
d'écrire (si l'extension est associée à une
application) :
<!NOTATION GIF SYSTEM "GIF">
<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics
Interchange Format 89a//EN">
Il est recommandé (pour faciliter la maintenance) de
regrouper
toutes les notations dans un fichier unique qui est ensuite
appelé dans
la DTD :
<!ENTITY %mesentites SYSTEM "entites.ent">