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 document 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.
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.
L'historique suivant retrace les grandes étapes qui ont conduit à la naissance de XML. L'ancêtre de XML est le langage SGML qui a été introduit en 1986 par C. Goldfarb. SGML a été conçu pour des documentations techniques de grande ampleur. Sa grande complexité a freiné son utilisation en dehors des projets de grande envergure. En 1991, T. Berners-Lee a défini le langage HTML pour le WEB. Ce langage est une version simplifiée à l'extrême de SGML, destinée à une utilisation très ciblée. XML est, en quelque sorte, intermédiaire entre SGML et HTML. Il évite les aspects les plus complexes de SGML tout en gardant suffisamment de souplesse pour une utilisation généraliste. La version 1.0 de XML a été publiée en 1998 par le consortium W3C (World Wide Web Consortium). Une redéfinition XHTML de HTML 4.0 à travers XML a été donnée en 1999. Un seconde version 1.1, qui est simplement une mise à jour pour les caractères spéciaux en lien avec Unicode, a, ensuite, été publiée en 2004.
XML est devenu omniprésent dans le monde de l'informatique. De nombreux standards sont apparus et permettent à des applications différentes de stocker mais surtout de partager des documents. L'exemple le plus emblématique et le plus connu est le format OpenDocument qui est utilisé par OpenOffice, maintenant appelé LibreOffice, mais aussi par d'autres suites bureautiques comme KOffice. Un autre exemple est le format de dessins vectoriels SVG utilisé par Inkscape. Ce succès de XML est en grande partie du à ses qualités. Nous allons d'abord énumérer ces caractéristiques essentielles qui ont conduit à ce développement puis nous allons les détailler plus en profondeur.
Séparation stricte entre contenu et présentation
Simplicité, universalité et extensibilité
Format texte avec gestion des caractères spéciaux
Structuration forte
Modèles de documents (DTD et Schémas XML)
Format libre
Une des idées directrices de XML est la séparation entre contenu et
présentation. Il faut bien distinguer le contenu d'un document et la
présentation qui en est donnée. Un même contenu peut être rendu de
façons très différentes. Cet ouvrage peut, par exemple, se présenter
comme un livre imprimé ou comme une collections de pages WEB. Le contenu
est constitué, au départ, de textes et d'illustrations mais aussi de
liens entre ces éléments. L'organisation du texte en chapitres, sections
et sous-sections ainsi que les renvois entre chapitres font partie
intégrante du contenu du document. La présentation est au contraire la
façon de présenter ce contenu au lecteur. Un des premiers principes de
XML est d'organiser le contenu de manière indépendante de la
présentation. Ce principe de séparation est déjà présent dans HTML. Le
rendu d'une page HTML est globalement confié au navigateur. Les
paragraphes des documents HTML sont, par exemple, écrits au kilomètre,
sans indication de fins de lignes. Il appartient au navigateur de les
découper en lignes en fonction de la taille de la page. C'est très
différent d'un document PDF où le découpage en pages et en lignes est
figée par le document. La séparation n'est cependant pas totale en HTML.
Certaines balises comme <ul>
et
<li>
sont destinées à la structuration du
document. Pour ces deux balises, il s'agit d'écrire une énumération. La
présentation de cette énumération (marges, symbole marquant chaque
entrée, …) est déléguée au navigateur. D'autre balises comme
<i>
ou <b>
donnent
davantage des indications de présentation. Cette séparation entre
contenu et présentation a été accrue en HTML par l'introduction de CSS. Une feuille de style CSS est chargée de
donner au navigateur toutes les informations relatives à la présentation.
Le document HTML peut alors se recentrer sur la structuration du contenu
de façon indépendante de la présentation.
Cette séparation entre contenu et présentation est difficile à obtenir. Le rédacteur d'un document a souvent une présentation en tête et il est tentant pour lui d'essayer de l'imposer.
La séparation est encore plus marquée en XML car la signification des balises n'est pas figée comme en HTML. La règles est alors de choisir les balises pour organiser le document en privilégiant la structure de celui-ci par rapport à une éventuelle présentation.
Un second principe de XML est une structuration forte du document. Pour illustrer ce principe, la même adresse est donnée ci-dessous dans un style HTML puis dans un style XML.
Olivier Carton<br/> 175, rue du Chevaleret<br/> 75013 Paris<br/> <tt>Olivier.Carton@liafa.jussieu.fr</tt>
<address> <personname> <firstname>Olivier</firstname> <surname>Carton</surname> </personname> <street> <streetnumber>175</streetnumber> <streetname>rue du Chevaleret</streetname> </street> <zipcode>75013</zipcode><city>Paris</city> <email>Olivier.Carton@liafa.jussieu.fr</email> </address>
Les deux adresses contiennent les mêmes informations purement
textuelles. La suppression des balises comme
<br/>
ou <firstname>
donne le même résultat pour les deux adresses. Les balises
<br/>
présentes dans la première adresse
permettent le découpage en ligne et la balise
<tt>
indique une police de caractères appropriée
pour l'adresse électronique. Le rôle de ces balises est seulement
d'assurer un rendu correct de l'adresse. Les balises dans la première
adresse relèvent de la présentation alors que les balises dans la seconde
adresse comme <firstname>
ont un rôle
sémantique. Ces dernières structurent les données textuelles et ajoutent
ainsi de l'information. Le nom est, par exemple, décomposé en prénom et
nom. Cette information supplémentaire facilite le traitement des
données. Il devient, par exemple, très facile de mettre le nom en
majuscule. En revanche, le rendu exact de l'adresse électronique est à
la charge de l'application traitant l'adresse. L'adresse électronique
peut, par exemple, être supprimée si l'adresse est utilisée pour une
lettre.
Une des caractéristiques essentielles de XML est son extensibilité
et sa flexibilité. Contrairement à HTML, le vocabulaire, c'est-à-dire
l'ensemble des balises autorisées, n'est pas figé. La norme HTML fixe
les balises pouvant apparaître dans un document ainsi que leur
imbrication possible. À titre d'exemple, la balise
<li>
peut uniquement apparaître dans le contenu
d'une balise <ul>
ou
<ol>
. En revanche, les noms des balises XML
sont libres. Il appartient aux auteurs de documents de fixer les balises
utilisées. Il est seulement nécessaire que les auteurs s'entendent sur
le vocabulaire, c'est-à-dire la liste des balises utilisées, lorsque des
documents sont échangés. Cette liberté dans les noms de balises permet
de définir des vocabulaires particuliers adaptés aux différentes
applications. Il existe ainsi des vocabulaires pour décrire des dessins
vectoriels, des échanges commerciaux ou des programmes de télévision.
Ces vocabulaires particuliers sont appelés dialectes
XML. Il en existe des centaines voire des milliers pour couvrir tous les
champs d'application de XML.
La liberté dans le choix des noms de balises implique une
contrepartie. Il devient nécessaire de fixer des règles que doivent
respecter les documents. Sans ces règles, il n'est pas possible
d'échanger et de traiter de manière automatique ces documents. Ces
règles doivent d'abord fixer le vocabulaire mais aussi les relations
entre les balises. Les règles peuvent, par exemple, imposer qu'une
balise <address>
(cf. exemple ci-dessus)
contiennent exactement une balise <zipcode>
et
une balise <city>
sans pour autant fixer l'ordre
de ces deux balises. Ces ensembles de règles portant sur les documents
XML sont appelés modèles de documents. Plusieurs
langages ont été développés pour décrire ces modèles. Le premier de ces
langages est celui des DTD (Document Type Definition) qui est hérité de
SGML. Des langages plus puissants, parmi lesquels les schémas ou relax
NG, ont été introduits depuis pour remplacer les DTD. L'intérêt
principal de ces modèles de documents est de pouvoir décrire
explicitement les règles à respecter pour un document et de pouvoir
vérifier si un document donné les respecte effectivement. Avant ces
modèles de documents, il n'était pas rare que les données à fournir à un
logiciel ne fussent pas décrites de façon très précise. Il n'était alors
pas toujours facile de prévoir si des données seraient acceptées par le
logiciel, et si ce n'était pas le cas de déterminer lequel des données ou
du logiciel était en cause.
Les modèles de document tels que les DTD ou les schémas peuvent servir à une vérification automatique des documents. Il existe plusieurs implémentations de ces modèles. Cela autorise la vérification qu'un document donné satisfait ou non les contraintes spécifiées par une DTD ou un schéma. Lorsque les entrées possibles d'un logiciel sont décrites par un tel modèle, il est possible de vérifier de façon indépendante du logiciel que les données sont correctes. Cette possibilité est particulièrement intéressante lors d'échanges de documents.
Bien que les données présentes dans un document XML soient fortement structurées, le format XML est un format basé sur du texte. Il est ainsi possible de manipuler un document XML à l'aide d'un simple éditeur de texte. Il n'est pas nécessaire d'utiliser un logiciel spécialisé. Il existe bien sûr des logiciels spécialement conçus pour l'édition de documents XML. Ceux-ci peuvent grandement faciliter la tâche de l'auteur mais ils ne sont pas indispensables. Cet ouvrage a, par exemple, été rédigé avec l'éditeur Emacs.
Un des atouts d'XML est sa prise en charge native des caractères spéciaux grâce à Unicode. De plus, il est possible d'utiliser les différents codages (UTF-8, Latin-1, …) possibles puisque l'entête d'un document spécifie le codage.
De nombreuses technologies se sont développées autour de XML et en facilitent l'utilisation. Un des champs d'application est la manipulation et la transformation de documents XML. Il s'agit, par exemple, de réorganiser un document ou d'en extraire des fragments ou de le transformer complètement dans un autre format comme PDF. Comme tous les documents XML partagent la même syntaxe quel que soit leur vocabulaire, des outils permettent de manipuler ces documents de manière générale en s'affranchissant des aspects syntaxiques. Des langages de haut niveau comme XSLT autorisent la description simple et concise de transformations. Le grand intérêt de ces langages est qu'ils sont indépendants du vocabulaire utilisés et qu'ils s'adaptent à tous les dialectes XML. Le langage XSLT manipule chaque document XML sous la forme d'un arbre issu de la structure des données. Les transformations sont décrites en XSLT par des règles qui s'appliquent aux fragments délimités par les balises. Ce langage XSLT est doublement intéressant. D'une part, il constitue un outil à la fois pratique et puissant et donc d'une grande utilité face à de nombreux problèmes concrets. D'autre part, il représente une approche originale de la programmation car il n'est pas basé sur la programmation impérative ou fonctionnelle de la grande majorité des langages. À ce titre, il est digne d'intérêt en soi. Le langage XSLT est lui-même un dialecte XML car il utilise la syntaxe XML. Des programmes XSLT peuvent être eux-mêmes manipulés et créés par d'autres programmes XSLT. Ce mécanisme est d'ailleurs mis en œuvre par les schematrons.
Le langage XML est totalement libre car il est développé par le W3C. Chacun peut l'utiliser sans devoir acheter une quelconque licence. Cette absence de droits favorise le développement de logiciels libres mis à disposition de la communauté. Il existe ainsi une très grande variété de logiciels libres autour de XML qui en couvrent les différents aspects.
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.
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 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 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.
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 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.
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.
Abonnement à des flux de données
Langage de description d'interfaces graphiques développé par le projet Mozilla.
Description de dessins vectoriels
Description de contenus multimédia
Description de formules mathématiques
Description de services WEB
Format pour les signatures électroniques
Langage d'échange d'authentifications et d'autorisations
Bibliothèque de documents standards pour les échanges commerciaux
Format de document pour les applications bureautiques développé au départ pour OpenOffice mais aussi utilisé par d'autres logiciels libres comme KOffice
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.
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 dialecte. 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.
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
.
<!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. Ces indications de navigation facilitent la compréhension des liens entre les différentes notions. Il a quelques fois été pris la liberté 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 qui sont
toujours écrits en hexadécimal précédés de U+
comme
U+2023
ou U+20AC
.