Powered by |
Introduction à XMLMichel CASABIANCA - casa@sweetohm.netCet article est le premier d'une série de trois consacrés à XML, XSLT et le développement d'application XML en Java. Il traite de la syntaxe XML et des applications de ce langage de balises.
Présentation de XMLOriginesXML (eXtensible Markup Language) est né du constat que le HTML n'est pas adapté aux futures exigences de l'internet. Des ingénieurs ont alors eu l'idée de remplacer le HTML par SGML (Standard Generalized Markup Language), seul système capable à l'époque de succéder au HTML. Jon Bosak, qui travaillait pour Sun, a alors été chargé par le W3C de "mettre le SGML sur le web". Le travail de définition de ce qui allait devenir le XML (suggestion du gourou SGML James Clark) a duré onze semaines (de la fin août 1996 à novembre de la même année, date de publication du premier draft). Les finitions ont pris encore une année et la version 1.0 de la norme a été publiée en février 1998. L'idée du groupe de travail du W3C était de créer un langage de balisage hypertexte aussi simple à apprendre et utiliser que le HTML et aussi puissant que le SGML. C'est une démarche similaire qui a conduit Sun à développer Java (simplification du C++). Comparaison avec HTMLComme nous l'avons vu plus haut, HTML est le petit neveu du XML et présente avec lui de nombreux points commun; de plus, il présente l'avantage d'être connu de tous. Nous allons donc maintenant comparer les deux langages avec un petit exemple de carnet d'adresse: La version HTML est la suivante:
Cette page se passe de commentaires. Voyons maintenant la version XML:
Nous pouvons noter les points suivants:
Cette liste met en valeur les caractéristiques essentielles du XML: il dissocie le fond (les éléments indiquent la nature des données qu'ils encapsulent) et la forme (la représentation d'un document). D'autre part, la syntaxe d'un document XML est à la fois plus rigoureuse que celle d'un document SGML (et par extension, de celle d'un document HTML qui est une instance de SGML) et bien plus simple tout en gardant une compatibilité avec SGML. Ces caractéristiques ont fait le succès de XML. La dissociation du fond et de la forme permet le traitement automatique des données (ce qui est très difficile avec un document HTML). Sa simplicité permet un apprentissage rapide (quelques heures suffisent pour acquérir les bases du XML) et une implémentation facile des parsers. La rigueur du XML quand à elle, a facilité l'échange des données XML. Pour finir, la compatibilité avec SGML a permis une adoption rapide par réutilisation des outils existants (il suffit souvent de paramétrer les outils SGML pour les rendre compatibles avec XML). Types de documentL'agencement des éléments XML d'un type de fichier peut être contraint par une DTD (pour Document Type Definition). Par exemple, une DTD pour un répertoire d'adresse pourrait être la suivante:
Cette DTD indique que:
Nous verrons plus tard en détail la syntaxe d'une DTD, mais nous pouvons dors et déjà comprendre son intérêt: elle permet de s'assurer (en validant un document) que ce document est valide pour cette DTD et donc qu'aucun renseignement n'a été omis. Cette validation intervient au niveau du programme traitant le fichier XML lors de sa mise en forme ou de son traitement. Mise en formeContrairement à un document HTML (qui peut être affiché par un navigateur), un document XML ne peut à priori pas être affiché par un programme puisque les éléments qui composent ce document sont à l'initiative du rédacteur du document (ou de celui de la DTD). Pour visualiser un document XML, il est donc nécessaire de le transformer en un document mis en forme. C'est le rôle des feuilles de style (ou style sheets en anglais). Le standard XML pour les feuilles de style est XSLT pour eXtensible Stylesheet Language et T pour Transformation. Une feuille de style XSLT transforme (à l'aide d'un processeur XSLT) un document XML en un document HTML, un autre document XML (conforme à une autre DTD en général) ou tout autre format. Le principe de fonctionnement est donc le suivant:
Figure 1: Transformation XSLT Nous étudierons ces feuilles de style dans un article ultérieur et je ne m'y attarderai donc pas. Terminologie XMLXML comporte une terminologie qui lui est propre. On appelle élément les balises (appelés tags en HTML). Par exemple, <adresse> est un élément. Un élément peut comporter des informations internes qui sont localisées dans des attributs. Par exemple, l'élément adresse <adresse lieu="domicile"> comporte un attribut lieu dont le contenu est domicile. Une entité est une référence remplacée lors du parsing du document par une valeur qui leur est assignée. L'élément le plus extérieur au document (dans lequel sont imbriqués tous les autres éléments d'un document) est appelé racine de ce document. Un document XML peut être représenté comme un arbre dans lequel les éléments ou les fragments de texte sont des noeuds. Par exemple, le document suivant:
Peut être représenté par l'arbre ci-dessous:
Figure 2: Arbre XML Un parser est un programme capable de parcourir un document XML, de le valider (vérifier sa syntaxe XML et sa conformité à une DTD) pour en extraire les données qu'il contient. Syntaxe XMLMaintenant que nous avons une idée générale de ce qu'est un document XML, nous allons en étudier la syntaxe en détail. En têteTout document XML doit commencer par un en tête standard de la forme:
Ceci n'est pas un élément mais une instruction de traitement (ou processing instruction en anglais) car entourée des marques <? et ?>. Elle indique que c'est un document XML conforme à la recommandation (c'est ainsi que l'on appelle les standards au W3, organisation de normalisation du web) en version 1.0. L'attribut encoding indique l'encodage du document. Un autre attribut standalone (pouvant prendre les valeurs yes ou no) indique si le document peut être lu seul (valeur yes) ou s'il est muni d'une DTD (valeur no). Déclaration du type de documentOn peut indiquer le type de document dans une déclaration DOCTYPE, comme suit:
Cette déclaration indique que le document est de type article (qui est nécessairement l'élément racine du document) et que l'on peut trouver la DTD dans le fichier ../dtd/article.dtd (chemin relatif au fichier XML lui même). Lors du parsing du document, le parser charge ce fichier et valide le document par rapport à cette DTD. Cette déclaration est optionnelle: un fichier peut ne pas être associé à une DTD. Dans ce cas, il n'y a pas de contrainte concernant les éléments du document, mais la syntaxe XML doit être correcte (on dit alors que le document est bien formé). Un document conforme à une DTD est dit valide. Il existe une autre forme de déclaration DOCTYPE:
Cette déclaration indique que le document est de type article et permet de retrouver la DTD par:
Les instructions de traitementCes marqueurs ont la forme suivante:
Ces marqueurs sont destinés aux applications qui vont traiter ce document et ne font pas à proprement parler partie du document. CommentairesLes commentaires sont semblables à ceux du HTML:
Ces commentaires sont ignorés lors du parsing du document. Sections CDATAUn telle section ne sera pas interprétée par le parser. Par exemple la section suivante est parfaitement valide (parce que non parsée par le parser):
En pratique, ces sections CDATA sont très commodes pour écrire un fragment de XML d'exemple dans un document XML. Il est aussi commode de s'en servir pour un fragment de code (qui peut comporter des signes < qui provoqueront des erreurs de parsing). Éléments et attributsUn élément peut contenir des attributs, d'autres éléments, du texte ou une combinaison des deux. Un nom d'élément doit commencer par une lettre ou un underscore et peut comporter tout nombre de lettres, chiffres, trait d'union, point, double point ou underscore. Les noms d'éléments commençant par xml sont réservés. Les noms d'éléments sont sensibles à la casse. Les lettres des noms d'éléments peuvent être de tout alphabet pourvu que ce soit celui déclaré dans l'encodage du document. Les noms d'attributs sont sujets aux mêmes restrictions que ceux des éléments. La valeur de l'attribut doit être encadrée par des guillemets simples ou doubles. La valeur d'un élément délimitée par des guillemets simples peut contenir des guillemets doubles et inversement. Par exemple, on pourra écrire:
Ou encore:
Il existe deux attributs réservés:
Par défaut, XML se réserve le droit, comme HTML, de remplacer une suite de blancs (espaces, saut de ligne ou tabulations) par un seul espace. Ceci s'explique par le fait qu'un saut de ligne n'a pas de signification de formatage puisque ce dernier dépend du système sur lequel est affiché le document. Par exemple, le texte suivant:
Sera affiché de la manière suivante (si on ne demande pas au parser de préserver les blancs):
EntitésXML définit cinq entités qui permettent d'éviter les collisions du texte avec la syntaxe XML:
Pour éviter une collision avec la marque d'ouverture d'un élément, on pourra écrire dans un document XML le signe inférieur à avec l'entité suivante:
Lors du parsing, la référence à l'entité est remplacée par sa valeur et le texte devient:
On peut aussi faire référence à tout caractère UNICODE avec une entité numérique de la forme &#xxx; où xxx est la valeur de ce caractère dans le standard UNICODE (en décimal ou en hexadécimal si cette valeur commence par un x). On peut ainsi écrire le signe copyright (©) avec l'entité ©. Types de documentsLes types de documents permettent de contraindre les éléments à respecter une syntaxe donnée. Une DTD peut comporter des déclarations d'éléments, d'attributs, d'entités ou de notations. Déclaration d'élémentUne déclaration d'élément a la forme suivante:
La règle peut être une liste d'éléments. Par exemple, on peut définir un élément adresse par:
Cela indique qu'une adresse est composée d'un élément rue suivi d'un élément cp puis d'un élément ville. On peut indiquer qu'un élément est optionnel (il peut apparaître 0 ou 1 fois) avec le marqueur ? après le nom de cet élément. Par exemple, pour indiquer qu'un élément cedex peut être présent à la fin d'une adresse, on déclarera cet élément adresse par:
De la même manière, on peut indiquer qu'un élément peut être présent en au moins un exemplaire à l'aide du marqueur + (plus) ou en un nombre quelconque d'exemplaires (y compris 0) avec le marqueur * (étoile). On peut aussi combiner des éléments avec des opérateurs logiques et et ou. La virgule (vue ci dessus) est l'opérateur et et le trait vertical (pipe UNIX) est l'opérateur ou. Par exemple:
Indique que l'élément adresse peut être composé en premier lieu d'un élément rue ou d'un élément lieu-dit. Le marqueur #PCDATA (que nous verrons plus loin en détail) peut apparaître dans une liste, pour indiquer la présence de texte (mixed content), mais:
Par exemple, la déclaration:
Est valide, mais la suivante ne l'est pas:
En effet, le marqueur #PCDATA n'est pas en première place dans la liste et celle ci ne se termine pas par un marqueur *. Ces contraintes impliquent que l'on ne peut pas contraindre un élément à comporter des sous éléments et du texte dans un ordre et en nombre déterminés. Un élément peut être déclaré comme devant être vide à l'aide de la règle EMPTY. On peut aussi indiquer qu'il peut contenir tout élément avec le marqueur ANY. Pour finir, on peut indiquer qu'un élément ne peut contenir que du texte à l'aide du marqueur #PCDATA (pour Parsed Character Data). Par exemple, un élément titre pourrait être déclaré par:
Ce qui signifie qu'il ne peut contenir que du texte à l'exclusion de tout élément. Déclaration d'une liste d'attributsUn élément peut comporter des attributs que l'on déclare dans une DTD à l'aide d'une déclaration ATTLIST (pour ATTribute LIST). Une telle déclaration est de la forme:
Les types possibles sont les suivants:
La valeur de l'attribut peut être une valeur (que l'on note entre guillemets) ou l'un des mots clef ci-dessous:
Nous allons maintenant étudier des exemples pour clarifier ces déclarations d'attributs:
Cette déclaration indique que l'élément prix peut comporter un attribut monaie qui est de type caractère.
Indique que l'élément prix peut comporter un attribut monaie. Si ce n'est pas le cas, le parser en insère un avec la valeur euro.
Indique de l'élément prix doit comporter un attribut monnaie. Il n'y a donc pas de valeur par défaut et si l'on n'indique pas cet attribut dans le document, il en résulte une erreur de parsing.
Indique que l'attribut monnaie a toujours la valeur euro.
Indique que l'attribut monaie peut prendre une des valeurs franc ou euro. Si l'attribut est omis, la valeur euro lui est donnée par défaut. Les exemples ci dessus sont les cas d'utilisation les plus fréquents. Une autre notion importante est celle d'identifiant:
Déclare un attribut id de type ID. C'est un identifiant unique dans le document. On peut y faire référence dans un attribut de type IDREF:
Lorsque la parser rencontre un attribut de type IDREF, il vérifie que la référence est présente dans le document. On crée ainsi des liens à l'intérieur d'un même document. Si nous déclarions les attributs id et idref comme étant de type CDATA, nous ne serions pas assurés que notre document ne comporte pas de liens cassés (parce que l'unicité et l'existence des identifiants ne serait pas vérifiés). Le type IDREFS est une liste de références à des identifiants séparés par des espaces. Un attribut peut aussi être déclaré de type NMTOKEN. Dans ce cas, la valeur de l'attribut doit être un token XML (c'est à dire un nom ayant les mêmes restrictions que celui d'un élément, sauf qu'il peut commencer par un chiffre, un tiret ou une virgule). Le type NMTOKENS est une liste de tokens séparés par des espaces. Pour finir, le type NOTATION doit contenir une notation définie au préalable dans la DTD (voire plus loin). Déclaration d'une entitéUne entité permet d'écrire un caractère ou chaîne de caractères qu'il serait impossible (parce que l'encodage du document ou le clavier ne le permettent pas) ou fastidieux d'écrire. Par exemple, la déclaration suivante (que l'on doit écrire dans une DTD):
Permet simplement d'insérer le signe de copyright dans un document, à l'aide de l'écriture suivante:
Lors du parsing du document, on obtiendra:
Il existe des entités dont la portée est réduite à la DTD dans laquelle elles sont déclarées, ce sont les entités paramètres. Par exemple, la déclaration suivante:
Permet de simplifier l'écriture de déclarations d'attributs, comme celui-ci:
De la manière suivante:
On peut voire les entités paramètres comme des macros pour l'écriture de DTDs. Les entités externes quand à elles permettent de faire référence à un document externe. Par exemple, la déclaration suivante:
Permet d'inclure la liste des prix dans un document XML à l'aide de la simple référence:
Inutile de dire que cela peut poser des problèmes de sécurité de faire référence à un document externe... Pour finir, il est possible de déclarer des entités non parsées avec une déclaration du type:
NDATA signifie ici Notation DATA. Il faut bien sûr avoir au préalable déclaré la notation à l'aide d'une déclaration <!NOTATION ...>. Déclaration de notationLes notations permettent d'identifier par leur nom des entités non XML (qui ne doivent être parsées). On peut ainsi identifier le type d'image GIF par la déclaration:
On pourra alors faire référence à ce type d'image dans une entité externe ou un attribut de type NOTATION. Sous DTD internesUn document XML peut incorporer sa propre DTD après la déclaration du type de document de la manière suivante:
Il est aussi possible de modifier une DTD existante pour un document en incluant une sous DTD interne dans la déclaration DOCTYPE comme suit:
Il faut cependant éviter ce genre de raccourcis car un fragment de cet article (que l'on pourrait insérer dans un autre par copier/coller) pourrait, s'il inclue une référence à l'entité rec, ne plus être valide hors de ce document. Sections INCLUDE/IGNOREIl est possible de marquer une section à inclure dans la DTD avec un marqueur du type:
Une section à ignorer pourra quand à elle être marquée de la manière suivante:
Les plus attentifs auront remarqué que ces sections ne servent à rien utilisées telles-quelles (à quoi sert-il de marquer une section à inclure alors que c'est le cas par défaut ? À quoi sert-il d'écrire une section à ignorer ?). L'intérêt vient de l'utilisation des entités paramètres: on peut remplacer les mots INCLUDE et IGNORE par des références à des entités paramètres comme ceci:
On donne deux définitions pour l'élément para: avec ou sans élément note imbriqué suivant les valeurs des entités paramètres final et draft. Si final vaut INCLUDE et draft vaut IGNORE, alors la définition de l'élément para devient:
Dans le cas contraire, la définition de l'élément para devient:
En modifiant la valeur de l'entité paramètre, on change la DTD du document et les notes peuvent ou pas être légales dans un paragraphe. Ces inclusions prennent tous leur sens lorsque les entités paramètres sont définies dans la sous DTD interne. Espaces de nommageLes espaces de nommage (une recommandation du W3 distincte de la recommandation XML, mais qui lui est maintenant presque indissociable) permettent d'éviter les collisions entre les DTDs de documents d'origines diverses (qui peuvent donc déclarer des éléments de même nom mais ayant des significations différentes). On déclare un espace de nommage dans un attribut xmlns (pour XML Name Space) d'un élément, de la manière suivante:
La valeur foo est un préfixe définissant l'espace de nommage http://www.bar.com/foo. Donc l'élément de la déclaration et tout élément inclus dans cet élément element et dont le nom commence par foo: appartient à cet espace. On notera que si un nom d'élément peut comporter le caractère : (deux points), il est préférable de l'éviter pour ne pas créer de confusion avec les espaces de nommage. D'autre part, on placera généralement cette déclaration à la racine du document de manière à ce que sa portée soit le document entier. Enfin, l'URI délimitant l'espace de nommage doit comporter un nom de domaine dont on est propriétaire de manière à garantir l'absence de collision. Il est aussi possible de définir un espace de nommage par défaut (ce sera celui de tout élément n'ayant aucun préfixe d'espace de nommage) avec une déclaration du type:
Les espaces de nommage sont par exemple utilisés par le langage de feuilles de style XSLT dont toute feuille de style comporte l'élément racine suivant:
Dans une telle feuille de style, les éléments commençant par xsl: seront reconnus comme des éléments de l'espace unique http://www.w3.org/1999/XSL/Transform. Ainsi, un élément <xsl:value-of> sera distingué de <value-of>. ConclusionXML a pris ces dernières années une importance croissante au point de devenir une mode dans laquelle se sont engouffrés nombre de fournisseurs de logiciel (qui n'a pas aujourd'hui à son catalogue une base de donnée "XML" ou un système de RPC en XML ,suivez mon regard... ?). Par delà cet effet de mode, XML reste une technologie extrêmement souple et puissante qui, à n'en pas douter, vous deviendra vite indispensable. BibliographieCette bibliographie succincte permet d'approfondir ses connaissances sur XML (en particulier sur les thèmes non abordés dans ce texte). Internet
Livres
Dernière mise à jour : 2002-11-26 |