2. Documents valides
Un document XML valide est un document bien formé qui obéit en outre à une structure type, définie dans un schéma XML ou dans une définition de document type (DTD) : son prologue doit inclure une déclaration de type, contenant, directement ou par référence à des entités externes, des déclarations pour tous les éléments, attributs et entités utilisés. Le document valide sera une instance de cette structure prédéfinie.
Une DTD (Document Type Definition, définition de document type) est l'ensemble de toutes ces déclarations, dans une déclaration de type de document, le 'DOCTYPE'.
Un document peut inclure directement sa DTD, mais le vrai intérêt est la possibilité de l'utilisation externe : on inclut dans le document une déclaration de type faisant appel à la DTD externe à travers un URI. On peut également mélanger une DTD externe avec des déclarations locales (en cas d'incompatibilités entre déclarations locales et externes, les déclarations contenue dans la partie interne ont priorité).
What's in a DTD ... ?
Une DTD peut contenir :
- Des commentaires
- Déclarations d'éléments
- Déclarations de listes d'attributs
- Déclarations d'éntités générales
- Déclarations d'éntités paramètres
- Déclarations de notations
Déclaration d'élément
Cette déclaration définit un type d'élément
(par un nom), et l'associe à un certain modèle
de contenue. Elle a la forme : <!ELEMENT nom modèle>
Le 'nom' d'un élément, tout comme le 'nom' d'un attribut,
est un nom XML :
essentiellement ce n'est qu'une chaîne alphanumérique, qui,
en plus, peut contenir les symboles _ (underscore), - (trait)
et . (point). L'utilisation de tout autre symboles non-alphanumérique
est interdit, avec l'exception du : . (Mais l'utilisation de : dans les
noms XML est réservé pour les domaines
nominaux.) Attention: un nom XML commence obligatoirement avec _ ou un symbole
alphabétique !
Le 'modèle de contenu' peut autoriser l'utilisation d'un ou plusieurs
éléments fils spécifiés, des données,
une mélange de données et éléments fils (modèle
mixte), une mélange arbitraire de données et d'éléments
(contenu libre); le modèle peut aussi imposer que l'élément
reste toujours vide.
Les éléments fils peuvent avoir un ordre
imposé (ils forment une séquence : leurs noms sont
séparés par des virgules). Par exemple :
<!ELEMENT article (titre, resume, introduction, text)>
Dans un document valide, l'élément 'article' doit obligatoirement contenir
un (seul) élément 'titre', un (seul) élément 'resume',
un (seul) élément 'introduction' et un (seul) élément 'text',
et dans cet ordre.
Les éléments peuvent aussi être
énuméré, comme dans l'exemple suivant:
<!ELEMENT article (titre | resume | introduction | text)>
Maintenant, dans un document valide, l'élément 'article' contiendra
un (seul) élément : 'titre', 'resume', 'introductiion' ou 'text' ...
Les noms des éléments fils peuvent être suffixé par un des
indicateurs d'occurrence : ? (l'élément
est optionnel et ne peut être répété ; il peut
apparaître zéro ou une fois) , *
(élément optionnel, peut apparaître zéro,
une ou plusieurs fois) ou + (élément
obligatoire, doit apparaître au moins une fois). Absence
de suffixe signifie que l'élément doit apparaître
une et une seule fois. Les suffixes peuvent s'appliquer à un groupe
d'éléments. Voici un exemple :
<!ELEMENT article (titre, auteur, resume, sommaire?, introduction?,
(titre_paragraphe, introduction_paragraph?, texte_paragraph)+)>
En combinant l'énumération d'éléments fils
avec le suffixe *, il est possible de rendre l'ordre d'éléments
fils d'un élément donné libre ...
La présence de données dans le contenu
d'un élément est indiquée par le mot-clef '#PCDATA'
(Parsed Character Data)
: <!ELEMENT
texte_paragraph (#PCDATA)>
Dans un modèle mixte on autorise une mélange libre de données et éléments fils. Le suffixe de répétition est obligatoirement * , et '#PCDATA' apparaît toujours en première position. Exemple : [ à ajouter ... ]
Pour la déclaration d'un élément avec un contenu libre (absolument quelconque), on
utilise le mot-clef 'ANY' : <!ELEMENT
essaie (ANY)>
Un élément est déclaré vide
en utilisant le mot-clef 'EMPTY' : <!ELEMENT reference (EMPTY)>
Pour assurer la compatibilité avec les applications SGML les éléments
déclarés vides explicitement dans une DTD doivent
êtres fermés par la marque d'élément vide :
/> (Un élément instance,si son modèle le permet,
peut être vide, bien sur, sans que cela soit obligatoire.
Dans ce cas il sera fermé par une balise de clôture normale.)