Cours gratuits » Cours informatique » Cours développement web » Cours XML » XML Cours et exercices d’application pour developper les connaissances sur le langage

XML Cours et exercices d’application pour developper les connaissances sur le langage

Problème à signaler:

Télécharger



★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

XML Cours et exercices d’application pour développer les connaissances sur le langage

Le langage XML (eXtended Markup Language) est un format général de documents orienté texte. Il s'est imposé comme un standard incontournable de l'informatique. Il est aussi bien utilisé pour le stockage de documents que pour la transmission de données entre applications. Sa simplicité, sa flexibilité et ses possibilités d'extension ont permis de l'adapter à de multiples domaines allant des données géographiques au dessin vectoriel en passant par les échanges commerciaux. De nombreuses technologies se sont développées autour de XML et enrichissent ainsi son environnement.

e: 8pt;">Le langage XML dérive de SGML (Standard Generalized Markup Language) et de HTML (HyperText Markup Language). Comme ces derniers, il s'agit d'un langage orienté texte et formé de balises qui permettent d'organiser les données de manière structurée.

...

1.3. Langages apparentés

Un des atouts indéniables de XML est le nombre de technologies et de langages qui se sont développés autour de XML. Ceux-ci enrichissent les outils pour la manipulation des documents XML. La liste ci-dessous énumère les principaux langages qui font partie de l'environnement XML.

XLink [ ] et XPointer [ ] (liens entre documents)

XML contient déjà un mécanisme pour matérialiser des liens entre des éléments d'un document. XLink et XPointer permettent d'établir des liens entre documents et plus particulièrement entre un élément d'un document et un fragment d'un autre document. Ils généralisent les liens hypertextes des documents HTML en autorisant des liens entre plusieurs documents.

XPath [ ] (langage de sélection)

XPath est un langage d'expressions permettant de sélectionner des éléments dans un document XML. Il est la pierre angulaire du langage XSLT pour la transformation de documents. Il est abordé au chapitre 6 de cet ouvrage.

XQuery [ ] (langage de requête)

XQuery est un langage permettant d'extraire des informations à partir d'un ou plusieurs documents XML et de synthétiser de nouvelles informations à partir de celles extraites. Il s'apparente à un langage d'interrogation de bases de données et joue le rôle de SQL pour les documents XML.

Schémas XML [ ] (modèles de documents)

Les schémas XML remplacent les DTD héritées de SGML pour décrire des modèles de documents. Ils sont beaucoup plus souples et beaucoup plus puissants que les DTD. Ils sont abordés en détail au chapitre 5 de cet ouvrage.

XSLT [ ] (transformation de documents)

XSLT est un langage permettant d'exprimer facilement des transformations complexes entre documents XML. Il s'appuie sur la structuration forte des documents XML vus comme des arbres. Chaque transformation est décrite par des règles pour chacun des éléments du document. Il est étudié en profondeur au chapitre 8 de cet ouvrage.

1.4. Dialectes

De très nombreux dialectes ont été définis pour appliquer XML à des domaines très variés. Le grand avantage est que ces différents dialectes partagent la même syntaxe de base et que tous les outils XML peuvent être utilisés pour spécifier et manipuler ces documents. Il n'y a nul besoin de développer des outils spécifiques à ces différents dialectes. La liste ci-dessous énumère quelques uns de ces dialectes.

RSS [ ] (Really Simple Syndication)

Abonnement à des flux de données

XUL [ ] (XML-based User interface Language)

Langage de description d'interfaces graphiques développé par le projet Mozilla.

SVG [ ] (Scalable Vector Graphics)

Description de dessins vectoriels

SMIL [ ] (Synchronized Multimedia Integration Language)

Description de contenus multimédia

MathML [ ] (Mathematical Markup Language)

Description de formules mathématiques

WSDL [ ] (Web Services Description Language)

Description de services WEB

OpenStreetMap [ ]

Cartes libres

XML Signature [ ]

Format pour les signatures électroniques

Présentation de XML

SAML [ ] (Security Assertion Markup Language)

Langage d'échange d'authentifications et d'autorisations

UBL [ ] (Universal Business Language)

Bibliothèque de documents standards pour les échanges commerciaux

OpenDocument [ ]

Format de document pour les applications bureautiques développé au départ pour OpenOffice mais aussi utilisé par d'autres logiciels libres comme Calligra

DocBook [ ]

Format de documentation technique

De nombreux projets informatiques, comme Ant ou Android utilisent XML pour le stockage de données et en particulier pour les fichiers de configuration.

1.5. DocBook

DocBook est un exemple typique d'utilisation de XML. Il s'agit d'un format pour écrire des documents techniques. Il est particulièrement adapté à la rédaction de documentations de logiciels. Il est d'ailleurs utilisé par de nombreux projets de logiciels libres, éventuellement de grande ampleur, comme le projet KDE. Cet ouvrage a été rédigé en utilisant DocBook. L'intégralité du texte est répartie en plusieurs fichiers XML. Afin d'obtenir une mise en page de qualité, les documents XML sont convertis, avec le langage XSLT, en un document LaTeX qui peut alors produire un document PDF.

DocBook était au départ basé sur SGML mais il s'appuie maintenant sur XML dont il est un des dialectes. Il contient de nombreuses balises permettant de décrire et de structurer le contenu de façon très précise. Il existe ensuite différents outils permettant de traduire un document DocBook, en une seule page HTML, en plusieurs pages HTML avec des liens ou encore en un document PDF.

DocBook met l'accent sur l'organisation et la structure du document. Son vocabulaire contient de très nombreuses balises permettant de transcrire très finement la sémantique de chaque fragment, à la manière de la seconde adresse donnée au début de cette introduction. Cet exemple est, en fait, très inspiré de DocBook. En revanche, DocBook ne permet pas de spécifier le rendu du document. Il n'est pas possible de donner, par exemple, la couleur ou la police de caractères à utiliser pour le texte. L'idée directrice est qu'un document DocBook doit permettre la production de plusieurs documents finaux à partir d'un même document original : document PDF, pages WEB. Comme les contraintes de ces différents média sont très diverses, il est impossible de pouvoir les spécifier dans le document. Le choix de DocBook est de donner suffisamment d'indications sur le contenu aux applications qui réalisent les transformations pour obtenir un résultat de qualité. Les documents DocBook font souvent partie d'un ensemble de documentations, comme celle de KDE, dont la présentation est uniforme et donc déterminée de manière globale.

1.6. Conventions

Certaines conventions sont utilisées tout au long de cet ouvrage afin d'en faciliter la lecture. Tous les exemples et plus généralement, tous les fragments de texte pouvant apparaître dans un document XML sont écrits en utilisant une police de caractères fixe comme l'exemple d'entête ci-dessous. Les noms des balises sont en particulier écrits avec cette police.

<?xml version="1.0" encoding="iso-8859-1"?>

Lorsqu'un fragment de texte comporte des parties génériques qui doivent être remplacées pour obtenir un véritable exemple, ces parties sont écrites avec une police de caractères fixe et italique. L'exemple de déclaration de DTD ci-dessous signifie qu'une telle déclaration doit commencer par <!DOCTYPE suivi du nom de l'élément racine du document qui peut être un nom quelconque, différent de root-element.

 Présentation de XML

<!DOCTYPE root-element ... >

L'écriture ... signifie qu'une partie sans importance a été omise pour rendre la description plus concise et plus claire. Un exemple concret est obtenu en remplaçant root-element par simple et en complétant la partie omise.

<!DOCTYPE simple [

<!ELEMENT simple (#PCDATA)>

]>

Les références croisées entre les différents chapitres et sections de cet ouvrage jouent un rôle important. À chaque fois qu'un concept important est mentionné, le numéro de section où celui-ci est introduit est indiqué entre crochets de cette façon [Section 2.2]. Ces indications de navigation facilitent la compréhension des liens entre les différentes notions. La liberté a quelques fois été prise de mentionner des liens avec des concepts introduits plus tard dans l'ouvrage. Ces indications peuvent être ignorées dans une première lecture.

Les nombres sont généralement écrits en base décimale comme 123 ou 8364. Lorsque l'écriture d'un nombre est en base hexadécimale, celle-ci commence par x ou 0x comme 0x231 ou x20AC. L'exception à cette règle est l'écriture des points de code des caractères Unicode [Section 2.2] qui sont toujours écrits en hexadécimal précédés de U+ comme U+2023 ou U+20AC.

Chapitre 2. Syntaxe de XML

La syntaxe de XML est relativement simple. Elle est constituée de quelques règles pour l'écriture d'une entête et des balises pour structurer les données. Ces règles sont très similaires à celles du langage HTML utilisé pour les pages WEB mais elles sont, en même temps, plus générales et plus strictes. Elles sont plus générales car les noms des balises sont libres. Elles sont aussi plus strictes car elles imposent qu'à toute balise ouvrante corresponde une balise fermante.

2.1. Premier exemple

Le langage XML est un format orienté texte. Un document XML est simplement une suite de caractères respectant quelques règles. Il peut être stocké dans un fichier et/ou manipulé par des logiciel en utilisant un codage des caractères. Ce codage précise comment traduire chaque caractère en une suite d'octets réellement stockés ou manipulés. Les différents codages possibles et leurs incidences sur le traitement des documents sont abordés plus loin dans ce chapitre [Section 2.2]. Comme un document XML est seulement du texte, il peut être écrit comme l'exemple ci-dessous.

On commence par donner un premier exemple de document XML comme il peut être écrit dans un fichier bibliography.xml. Ce document représente une bibliographie de livres sur XML. Il a été tronqué ci-dessous pour réduire l'espace occupé. Ce document contient une liste de livres avec pour chaque livre, le titre, l'auteur, l'éditeur (publisher en anglais), l'année de parution, le numéro ISBN et éventuellement une URL.

<?xml version="1.0" encoding="iso-8859-1"?>

<!-- Time-stamp: "bibliography.xml       3 Mar 2008 16:24:04" -->

<!DOCTYPE bibliography SYSTEM "bibliography.dtd" > <bibliography>

<book key="Michard01" lang="fr">

<title>XML langage et applications</title>

<author>Alain Michard</author>

<year>2001</year>

<publisher>Eyrolles</publisher>

<isbn>2-212-09206-7</isbn>

<url>…/</url>

</book>

<book key="Zeldman03" lang="en">

<title>Designing with web standards</title>

<author>Jeffrey Zeldman</author>

<year>2003</year>

<publisher>New Riders</publisher>

<isbn>0-7357-1201-8</isbn>

</book>

...

</bibliography>

                Entête XML avec la version 1.0 et l'encodage iso-8859-1 des caractères.

Commentaire délimité par les chaînes de caractères <!-- et -->.

Déclaration de DTD externe dans le fichier bibliography.dtd.

Balise ouvrante de l'élément racine bibliography

Balise ouvrante de l'élément book avec deux attributs de noms key et lang et de valeurs Michard01

et fr

Balise fermante de l'élément racine bibliography

2.2. Caractères

Un document XML est une suite de caractères. Les caractères qui peuvent être utilisés sont ceux définis par la norme Unicode ISO 10646 [ ] aussi appelée UCS pour Universal Character Set. Cette norme recense tous les caractères des langues connues et tous les symboles utilisés dans les différentes disciplines. Elle nomme tous ces caractères et symboles et leur attribue un code sur 32 bits (4 octets) appelé simplement code Unicode ou point de code dans la terminologie Unicode. Dans la pratique, tous les points de code attribués à des caractères se situent dans l'intervalle de 0 à 0x10FFFF et ils utilisent donc au plus 21 bits. Cette longueur maximale ne sera pas dépassée avant longtemps car il reste encore de nombreux points de code non attribués dans cet intervalle pour des usages futurs. Unicode peut être vu comme un catalogue de tous les caractères disponibles. Un caractère dont le point de code est n est désigné par U+n où le nombre n est écrit en hexadécimal. L'écriture hexadécimale de n n'est pas préfixée du caractère 'x' car c'est implicite après les deux caractères 'U+'. Le caractère Euro '€' est, par exemple, désigné par U+20AC car son point de code est 8364 = 0x20AC. Le sous-ensemble des caractères Unicode dont les points de code tiennent sur 16 bits (2 octets), c'est-à-dire entre 0 et 65535 = 0xFFFF est appelé BMP pour Basic Multilingual Plane. Il couvre largement la très grande majorité des langues usuelles et les symboles les plus courants.

2.2.1. Caractères spéciaux

Les cinq caractères '<' U+2C, '>' U+2E, '&' U+26, ''' U+27 et '"' U+22 ont une signification particulière dans les documents XML. Les deux caractères '<' et '>' servent à délimiter les balises [Section 2.7.1], ainsi que les commentaires [Section 2.7.5] et les instructions de traitement [Section 2.7.6]. Le caractère '&' marque le début des références aux entités générales [Section 3.5.1]. Pour introduire ces caractères dans le contenu du document, il faut utiliser des sections littérales [Section 2.7.2] ou les entités prédéfinies [Section 3.5.1.2]. Les caractères ''' et '"' servent également de délimiteurs, en particulier pour les valeurs des attributs [Section 2.7.3]. Dans ces cas, il faut encore avoir recours aux entités prédéfinies pour les introduire.

2.2.2. Caractères d'espacement

Le traitement XML des caractères d'espacement est simple dans un premier temps. Chaque caractère d'espacement est équivalent à un espace et plusieurs espaces consécutifs sont encore équivalents à un seul espace. C'est le comportement habituel des langages de programmation classiques. Dans un second temps, le traitement des caractères d'espacement par une application est commandé par l'attribut xml:space [Section 2.7.4.2]. Les caractères d'espacement sont l'espace ' ' U+20, la tabulation U+09 ('\t' en notation du langage C), le saut de ligne U+0A ('\n' en C) et le retour chariot U+0D ('\r' en C).

Les fins de lignes sont normalisées par l'analyseur lexical (parser en anglais). Ceci signifie que les différentes combinaisons de fin de ligne sont remplacées par un seul caractère U+0A avant d'être transmises à l'application. Cette transformation garantit une indépendance vis à vis des différents systèmes d'exploitation. Les combinaisons remplacées par cette normalisation sont les suivantes.

la suite des deux caractères U+0D U+0A

la suite des deux caractères U+0D U+85

le caractère U+85 appelé Next Line

le caractère U+2028 appelé Line Separator

le caractère U+0D non suivi de U+0A ou U+85

Les deux caractères U+85 et U+2028 ne peuvent être correctement décodés qu'après la déclaration de l'encodage des caractères par l'entête [Section 2.6.1]. Leur usage dans l'entête est donc déconseillé.

2.2.3. Jetons et noms XML

Les identificateurs sont utilisés en XML pour nommer différents objets comme les éléments, les attributs, les instructions de traitement. Ils servent aussi à identifier certains éléments par l'intermédiaire des attributs de type ID [Section 3.7.2]. XML distingue deux types d'identificateurs: les jetons et les noms XML. La seule différence est que les noms XML doivent commencer par certains caractères particuliers. Dans la terminologie XML, les jetons sont appelés NMTOKEN pour name token.

Les caractères autorisés dans les identificateurs sont tous les caractères alphanumériques, c'est-à-dire les lettres minuscules [a-z], majuscules [A-Z] et les chiffres [0-9] ainsi que le tiret '-' U+2D, le point '.' U+2E, les deux points ':' U+3A et le tiret souligné '_' U+5F. Un jeton est une suite quelconque de ces caractères. Un nom XML est un jeton qui, en outre, commence par une lettre [a-zA-Z], le caractère ':' ou le caractère '_'.

 Syntaxe de XML

Les deux caractères '-' et '.' ainsi que les chiffres ne peuvent pas apparaître au début des noms. Il n'y a pas, a priori, de limite à la taille des identificateurs mais certains logiciels peuvent en imposer une dans la pratique.

Le caractère ':' est réservé à l'utilisation des espaces de noms [Chapitre 4]. De fait, il ne peut apparaître qu'une seule fois pour séparer un préfixe du nom local dans les noms des éléments et des attributs. Les espaces de noms amènent à distinguer les noms ayant un caractère ':', appelés noms qualifiés et les autres, appelés par opposition noms non qualifiés.

Les noms commençant par les trois lettres xml en minuscule ou majuscule, c'est-à-dire par une chaîne de [xX][mM][lL] sont réservés aux usages internes de XML. Ils ne peuvent pas être utilisés librement dans les documents mais ils peuvent cependant apparaître pour des utilisations spécifiques prévues par la norme. Les noms commençant par xml: comme xml:base font partie de l'espace de noms XML [Section 4.7].

Quelques exemples d'identificateurs sont donnés ci-dessous.

Noms XML valides :

name, id-42, xsl:template, sec.dtd-3.1 et _special_

Jetons qui ne sont pas des noms : -name, 42, 42-id et .sect.

Noms réservés :

xml:id et xml-stylesheet

La norme XML 1.1 prévoit que tout caractère Unicode de catégorie lettre peut apparaître dans les identificateurs. Il est, par exemple, possible d'avoir des noms d'éléments avec des caractères accentués. Il est cependant conseillé de se limiter aux caractères ASCII de [a-zA-Z] pour assurer une meilleure compatibilité. Beaucoup de logiciels ne gèrent pas les autres caractères dans les identificateurs.

2.2.4. Codage

Chaque caractère possède un point de code sur 32 bits mais un document ne contient pas directement ces points de code des caractères. Ce codage serait inefficace puisque chaque caractère occuperait 4 octets. Chaque document utilise un codage pour écrire les points de code des caractères. Il existe différents codages dont le codage par défaut UTF-8. Certains codages permettent d'écrire tous les points de code alors que d'autres permettent seulement d'écrire un sous-ensemble comme le BMP. Le codage utilisé par un document est indiqué dans l'entête [Section 2.6.1] de celui-ci. Les principaux codages utilisés par les documents XML sont décrits ci-dessous.

US-ASCII

Ce codage permet uniquement de coder les points de code de 0 à 0x7F des caractères ASCII. UCS-4 ou UTF-32 [ ]

Chaque caractère est codé directement par son point de code sur quatre octets. Ce codage permet donc de coder tous les caractères Unicode.

UCS-2 [ ]

Chaque caractère est codé par son point de code sur deux octets. Ce codage permet donc uniquement de coder les caractères du BMP.

UTF-16 [ ]

Ce codage coïncide essentiellement avec UCS-2 à l'exception de la plage de 2048 positions de 0xD800 à 0xDFFF qui permet de coder des caractères en dehors du BMP dont le point de code utilise au plus 20 bits. L'exclusion de cette plage ne pose aucun problème car elle ne contient aucun point de code attribué à un caractère. Un point de code ayant entre 17 et 20 bits est scindé en deux blocs de 10 bits répartis sur une paire de mots de 16 bits. Le premier bloc de 10 bits est préfixé des 6 bits 110110 pour former un premier mot de 16 bits et le second bloc de 10 bits est préfixé des 6 bits 110111 pour former un second mot de 16 bits.

...

Chapitre 4. Espaces de noms

4.1. Introduction

Les espaces de noms ont été introduits en XML afin de pouvoir mélanger plusieurs vocabulaires au sein d'un même document. De nombreux dialectes XML ont été définis pour des utilisations diverses et il est préférable de les réutiliser au maximum. Il est, en effet, fastidieux de redéfinir plusieurs fois les mêmes vocabulaires. Le recyclage des dialectes fait d'ailleurs partie des objectifs de XML.

Le mélange de plusieurs vocabulaires au sein d'un même document ne doit pas empêcher la validation de celui-ci. Il devient indispensable d'identifier la provenance de chaque élément et de chaque attribut afin de le valider correctement. Les espaces de noms jouent justement ce rôle. Chaque élément ou attribut appartient à un espace de noms qui détermine le vocabulaire dont il est issu. Cette appartenance est marquée par la présence dans le nom d'un préfixe associé à l'espace de noms.

Le mélange de plusieurs vocabulaires est illustré par l'exemple suivant. Afin d'insérer des métadonnées dans des documents, il est nécessaire de disposer d'éléments pour présenter celles-ci. Il existe déjà un standard, appelé Dublin Core, pour organiser ces métadonnées. Il comprend une quinzaine d'éléments dont title, creator, subject et date qui permettent de décrire les caractéristiques principales d'un document. Il est préférable d'utiliser le vocabulaire Dublin Core, qui est un standard international, plutôt que d'introduire un nouveau vocabulaire. Le document suivant est le document principal d'un livre au format DocBook. Les métadonnées sont contenues dans un élément metadata. Celui-ci contient plusieurs éléments du Dublin Core dont les noms commencent par le préfixe dc. L'élément include de XInclude fait partie d'un autre espace de noms marqué par le préfixe xi.

...

4.2. Identification d'un espace de noms

Un espace de noms est identifié par un URI [Section 2.3] appelé URI de l'espace de noms. Cet URI est très souvent une URL mais il est sans importance que l'URL pointe réellement sur un document. Cet URI garantit seulement que l'espace de noms soit identifié de manière unique. Dans la pratique, l'URL permet aussi souvent d'accéder à un document qui décrit l'espace de noms. Une liste [Section 4.9] des URI identifiant les principaux espaces de noms est donnée à la fin du chapitre.

4.3. Déclaration d'un espace de noms

Un espace de noms est déclaré par un pseudo attribut dont le nom prend la forme xmlns:prefix où prefix est un nom XML [Section 2.2.3] ne contenant pas le caractère ':'. La valeur de ce pseudo attribut est l'URI qui identifie l'espace de noms. La déclaration associe cet URI au nom prefix. Ce préfixe est ensuite utilisé pour qualifier les noms d'éléments. Bien que la déclaration d'un espace de noms se présente comme un attribut, celle-ci n'est pas considérée comme un attribut. Le langage XPath distingue, par exemple, les attributs des déclarations d'espaces de noms. Ces dernières sont manipulées par des fonctions spécifiques [Section 6.1.1.2] de XPath.

Un nom qualifié d'élément prend la forme prefix:local où prefix est un préfixe associé à un espace de noms et local est le nom local de l'élément. Ce nom local est également un nom XML ne contenant pas le caractère ':'. Dans la terminologie XML, les noms sans caractère ':' sont appelés NCNAME qui est l'abréviation de No Colon Name et les noms qualifiés sont appelés QNAME qui est, bien sûr, l'abréviation de Qualified Name.

Dans l'exemple suivant, on associe le préfixe hns à l'espace de noms de XHTML identifié par l'URI …. Ensuite, tous les éléments de cet espace de noms sont préfixés par hns:.

<hns:html xmlns:hns="…">

<hns:head>

<hns:title>Espaces de noms</hns:title>

</hns:head>

<hns:body>

...

</hns:body>

</hns:html>

Il est habituel d'associer l'espace de noms XHTML au préfixe html plutôt qu'à hns. L'exemple precédent devient alors l'exemple suivant qui est un document équivalent.

<html:html xmlns:html="…">

<html:head>

<html:title>Espaces de noms</html:title>

</html:head>

<html:body>

...

</html:body>

</html:html>

Le choix du préfixe est complètement arbitraire. Dans l'exemple précédent, on aurait pu utiliser foo ou bar à la place du préfixe html. La seul contrainte est d'être cohérent entre la déclaration du préfixe et son utilisation. Même si les préfixes peuvent être librement choisis, il est d'usage d'utiliser certains préfixes particuliers pour certains espaces de noms. Ainsi, on prend souvent html pour XHTML, xsd ou xs pour les schémas XML [Chapitre 5] et xsl les feuilles de style XSLT [Chapitre 8].

Il est bien sûr possible de déclarer plusieurs espaces de noms en utilisant plusieurs attributs de la forme xmlns:prefix. Dans l'exemple suivant, on déclare également l'espace de noms de MathML et on l'associe au préfixe mml.

Chapitre 5. Schémas XML

5.1. Introduction

Les schémas XML permettent, comme les DTD [Chapitre 3], de définir des modèles de documents. Il est ensuite possible de vérifier qu'un document donné est valide pour un schéma, c'est-à-dire respecte les contraintes données par le schéma. Les schémas ont été introduits pour combler certaines lacunes des DTD.

5.1.1. Comparaison avec les DTD

La première différence entre les schémas et les DTD est d'ordre syntaxique. La syntaxe des DTD est une syntaxe héritée de SGML qui est différente de la syntaxe XML pour le corps des documents. En revanche, la syntaxe des schémas est une syntaxe purement XML. Un schéma est, en effet, un document XML à part entière avec un élément racine xsd:schema et un espace de noms.

Les DTD manquent cruellement de précision dans la description des contenus des éléments. Cette lacune se manifeste surtout au niveau des contenus textuels et des contenus mixtes. Il est, par exemple, impossible d'imposer des contraintes sur les contenus textuels [Section 3.6.2] des éléments. Le seul type possible pour les contenus textuels est #PCDATA qui autorise toutes les chaînes de caractères. Les types pour les attributs sont un peu plus nombreux mais ils restent encore très limités. À l'inverse, les schémas possèdent une multitude de types prédéfinis [Section 5.5.1] pour les contenus textuels. Ces types couvrent les chaînes de caractères, les nombres comme les entiers et les flottants ainsi que les heures et les dates. Ces types peuvent, en outre, être affinés par des mécanismes de restriction et d'union. Il est possible de définir, à titre d'exemple, des types pour les entiers entre 1 et 12, les flottants avec deux décimales ou les chaînes d'au plus 16 caractères ne comportant que des chiffres et des tirets '-'.

Les DTD sont encore plus limitées dans la description des contenus mixtes [Section 3.6.3]. La seule possibilité est d'exprimer que le contenu d'un élément est un mélange, sans aucune contrainte, de texte et de certains éléments. Les schémas comblent cette lacune en permettant d'avoir des contenus mixtes [Section 5.5.4] aussi précis que les contenus purs qui décrivent l'ordre et les nombres d'occurrences des enfants d'un élément.

Dans une DTD, le contenu pur d'un élément est décrit directement par une expression rationnelle. Les schémas procèdent en deux étapes. Ils définissent des types qui sont ensuite associés aux éléments. Les schémas se distinguent des DTD par leurs possibilités de définir de nouveaux types. Il est d'abord possible de construire des types [Section 5.6] explicitement à la manière des DTD. Il existe ensuite des mécanismes permettant de définir un nouveau type à partir d'un autre type, soit prédéfini, soit déjà défini dans le schéma. Ce nouveau type est obtenu soit par extension [Section 5.8] soit par restriction [Section 5.9] du type de départ. L'extension consiste à enrichir le type en ajoutant du contenu et des attributs. La restriction consiste, à l'inverse, à ajouter des contraintes pour restreindre les contenus valides. Ces deux mécanismes permettent ainsi de construire une véritable hiérarchie de types semblable à l'approche orientée objet des langages comme Java ou C++.

Les schémas autorisent des facilités impossibles avec les DTD. La première est la possibilité d'avoir plusieurs éléments locaux [Section 5.4.5] avec des noms identiques mais avec des types et donc des contenus différents. Dans une DTD, un élément a une seule déclaration qui décrit ses contenus possibles pour toutes ses occurrences dans un document. Une deuxième facilité est formée des mécanismes de substitution de types et d'éléments [Section 5.10]. À titre d'exemple, un schéma peut prévoir qu'un élément puisse se substituer à un autre élément. Ces substitutions fonctionnent de pair avec la hiérarchie des types.

Les DTD ont une modularité très limitée et l'écriture de DTD d'envergure est un exercice difficile. Les seuls dispositifs mis à disposition des auteurs de DTD sont l'import de DTD externes [Section 3.2.2] et les entités paramètres [Section 3.5.2]. Les schémas possèdent plusieurs mécanismes destinés à une plus grande modularité. Le premier d'entre eux est la possibilité, pour les schémas, de définir des types par extension et restriction. Il existe également les groupes d'éléments et les groupes d'attributs [Section 5.11].

Les DTD proviennent de SGML et sont antérieures aux espaces de noms. Pour cette raison, elles ne les prennent pas en compte. La déclaration d'un élément se fait en donnant le nom qualifié de l'élément avec le préfixe et le nom local. Ceci impose, dans les documents, d'associer l'espace de noms à ce même préfixe. Ceci est contraire à l'esprit des espaces de noms où le préfixe est juste une abréviation interchangeable pour l'URI de l'espace de noms. Les schémas, au contraire, prennent en compte les espaces de noms [Section 5.13]. Un schéma déclare d'abord un espace de noms cible. Les éléments et les attributs sont ensuite déclarés, dans le schéma, avec leur nom local. Un document qui mélange des éléments et des attributs provenant d'espaces de noms différents peut encore être validé à l'aide des différents schémas pour les espaces de noms.

5.2. Un premier exemple

Voici un exemple de schéma XML définissant le type de document de la bibliographie [bibliography.xml]. Ce schéma est volontairement rudimentaire pour un premier exemple. Il n'est pas très précis sur les contenus de certains éléments. Un exemple plus complet pourrait être donné pour la bibliographie.


51