Introduction à XML

Les notes qui suivent ont été rédigées par Magali Contensin et révisées par Fred Mesnard.

Généralités

Pourquoi XML ?

Le web est confronté à deux problèmes : XML apporte une réponse à ces problèmes.

Caractéristiques de HTML

Caractéristiques de XML

Technologies liées à XML

Applications XML

XML est un métalangage permettant l'élaboration de balisages spécialisés. En fonction du contenu qu'on souhaite publier, on définit ses propres balises. Exemples d'applications existantes :

Document XML

Contenu d'un document

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 :

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.

Documents bien formés

Un document XML est bien formé (et donc l'analyseur XML peut construire son arborescence) si :

Documents valides

Un document est valide s'il :

Les DTDs définissent les éléments et les règles d'utilisation : noms des éléments, attributs possibles pour un élément, imbrications.

Une DTD est-elle obligatoire ?

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>

Structure d'un document

Un document XML comporte des éléments avec ou sans attributs qui fournissent des méta-informations sur l'information, i.e. sur le contenu du document. Un document XML comporte, outre d'éventuels commentaires :

Prologue

Déclaration XML

<?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).

Déclaration de DTD

La DTD peut être incluse dans le document ou être dans un fichier externe ou les deux. Elle est placée dans un fichier externe si elle doit servir dans plusieurs documents XML différents.
DTD externe
<!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.
DTD interne
La DTD interne se déclare entre crochets dans le DOCTYPE.
<!DOCTYPE librairie [
<!ELEMENT livre (titre, auteur, editeur..., commentaire?)>
<!ELEMENT titre (#PCDATA)>
...
<!ELEMENT commentaire (#PCDATA)>
]>

Instructions spécifiques pour les applications utilisant le document

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"?>.

Arbre des éléments

Représentation du document sous forme d'arbre

Tout document bien formé a une structure sous forme d'arbre, prenons comme exemple ce fichier HTML :
<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 HTML
|
|________ HEAD
| |
| |____ TITLE
|
|
|_______ BODY
|
|____ P
| |
| |____ EM
|
|____ P
Il 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>).

Eléments

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>

Domaines de noms

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>

Attributs

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.
Attributs réservés
xml:lang

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

xml:space = "default | preserve"

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.

Entités

Internes
Appel d'une entité dans un document : &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 &amp; &lt; &gt; &quot; &apos;. Tous les caractères peuvent être remplacés par une entité qui donne leur code &#code_car; (par exemple &#65; 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 "&#176;">
permettra d'utiliser l'abréviation &deg; dans le document, par exemple : il fait 25&deg;C qui s'affichera :
il fait 25°C. Les entités peuvent appeler d'autres entités, provoquant ainsi leur inclusion dans le document XML.
Externes

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"/>

Encodage des caractères

XML prend mieux en charge les caractères accentués que HTML où on utilise des appels d'entités (par exemple : &eacute; 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.

Commentaires

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

Sections CDATA

<![CDATA[ ... ]]> Section de données que le processeur XML n'interprétera pas. Ces sections permettent de passer des caractères réservés à une application (par exemple un signe mathématique <).

DTD

Qu'est-ce qu'une DTD ?

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.

Quelle différence entre une DTD interne et externe ?

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 :

Une DTD externe s'applique à plusieurs documents : quand on modifie un élément, la modification s'applique à tous les documents, ce qui n'est pas bien sûr le cas d'une modification de DTD interne.

Le sous-ensemble interne contient les déclarations spécifiques au document :

Le sous-ensemble interne n'aura aucun effet sur les autres documents faisant référence au sous-ensemble externe de la DTD. Le sous-ensemble interne a priorité sur le sous-ensemble externe ce qui permet de modifier localement un document.

Emplacement des déclarations

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

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

DTD externe

Le sous-ensemble externe est placé dans un fichier séparé. L'appel à ce fichier qui doit avoir le même nom que la racine du document (élément qui englobe tous les autres) est effectué dans le 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

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 // langue
avec :

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

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

Déclaration d'éléments

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>

élément vide

Un élément vide ne contient aucun texte, aucun autre élément, comme les éléments IMG, HR, BR de HTML.
<!ELEMENT nom_element EMPTY>
Par exemple, dans la DTD de XHTML 1.0, l'élément img est déclaré : <!ELEMENT img EMPTY>

élément non vide

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.

données

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

conteneur d'éléments

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 :

Par exemple, dans la DTD de XHTML 1.0 l'élément ul est déclaré : <!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)+>

mixte

Si l'élément a un contenu mixte (données + éléments), il est possible d'utiliser PCDATA et les éléments imbriqués. Par exemple, dans la DTD de XHTML 1.0 l'élément object est déclaré : <!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>

élément libre

C'est un élément qui peut contenir tout élément déclaré dans la DTD et du texte.
<!ELEMENT nom_element ANY>

Exemple

Voici la DTD qui peut être utilisée pour le document bibliothèque :
<!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)+>
<!ELEMENT livre (titre, auteur, ref)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT ref (#PCDATA)>
et dans le document XML :
<?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>

Déclaration d'attribut

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>

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

Types de données

chaînes de caractères

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

énumérations

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

tokens

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

identificateurs

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

entités

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>

notations

NOTATION signifie que l'attribut attend une notation qui apparaît dans la DTD dans une déclaration NOTATION

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

Déclaration d'entités

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.

Entités paramètres

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

Entités caractères

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

La DTD XHTML1.0 définit le caractère mathématique "il existe" et le caractère de l'alphabet grec "delta" :
<!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech -->
<!ENTITY delta "&#948;"> <!-- greek small letter delta, U+03B4 ISOgrk3 -->

Entités générales

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

Entités externes

Les entités externes représentent des données contenues dans des fichiers séparés par rapport au document XML.

Analysées

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

Non analysées

<!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">
<!ATTLIST image source ENTITY #REQUIRED>
<!ENTITY vacances SYSTEM "images/plage.gif" NDATA GIF89a>
ce qui permettra dans le document XML d'appeler l'image : <image source="vacances">
<!ENTITY vacances SYSTEM "plage.gif NDATA GIF89a">
qui sera utilisé dans le document XML : <image source="vacances"/>

Déclaration de notations

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

Valid HTML 4.01 Transitional