Cours XML Générale


Télécharger Cours XML Générale

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

Télécharger aussi :


Cours de base sur les aspects essentiels de XML

...

Chapitre 2. Syntaxe de XML

La syntaxe de XML est relativement simple. Elle nécessite un effort très modéré pour son apprentissage. 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 codages possibles et leurs incidences sont décrits 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.

...

 

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 .

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 à la fois simple dans une première approche et subtil et source de surprises dans un second temps. 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). Le traitement de ces caractères est indiqué aux applications par l'attribut xml:space [Section 2.7.4.2].

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. XML distingue deux types d'identificateurs appelés jetons (name token abrégé en NMTOKEN dans la terminologie XML) et noms XML dans cet ouvrage.

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 '_'. Les deux caractères '-' et '.' 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.

...

2.2.5.     Collations

Certaines ligatures comme le caractère 'œ' U+153 sont considérées par Unicode comme un seul caractère plutôt que comme la fusion des deux caractères 'oe'. Il s'ensuit que les deux mots cœur et coeur sont, a priori, considérés comme distincts. Ce problème est résolu par l'utilisation de collations lors du traitement des documents. Une collation est une collection de règles qui établissent des équivalences entre des caractères ou des suites      de caractères. Une collation peut, par exemple, déclarer que le caractère 'œ' U+153 est équivalent aux deux caractères 'oe' ou que la lettre 'ß' U+DF est équivalente aux deux lettres 'ss'. Une collation établit aussi l'ordre des caractères utilisé pour l'ordre lexicographique. Elle peut, par exemple, déclarer que le caractère 'é' se place entre les caractères 'e' et 'f'. La collation par défaut est basée sur les points de code des caractères. Le caractère 'é' U+E9 se trouve, pour cette collation, après le caractère 'z' U+7A et le mot zèbre est donc avant le mot étalon dans l'ordre lexicographique.

 2.2.6.    Normalisation

Le même caractère peut avoir plusieurs points de code. Cette ambiguïté provient du fait qu'Unicode a été construit en fusionnant plusieurs codages et qu'il tente de rester compatible avec chacun d'eux. Le caractère 'µ' est en même temps le caractère U+B5 qui provient de Latin-1 et le caractère U+3BC qui provient du bloc des caractères grecs. D'autres caractères peuvent avoir un point de code mais peuvent, en même temps, correspondre à une suite de plusieurs points de code. Le caractère 'ï' est, par exemple, le caractère U+EF mais il correspond également à la suite U+69 U+A8 formée du caractère 'i' suivi du caractère spécial tréma '¨' U+A8. Ce codage multiple conduit à des problèmes, en particulier pour la comparaison des chaînes de caractères. Pour palier à ce problème, Unicode introduit des normalisations qui transforment les différents codages en un codage canonique. La normalisation la plus standard est la normalisation C. Celle-ci transforme, par exemple, la suite de caractères U+69 U+A8 en le caractère 'ï' U+EF. La normalisation d'une chaîne de caractères peut être obtenue avec la fonction XPath normalize-unicode() [Section 6.3.3].

2.3.        URI, URL et URN

XML et toutes les technologies autour de XML font un grand usage des URI et plus particulièrement des URL. Ceux-ci sont, par exemple, employés pour référencer des documents externes comme des DTD [Chapitre 3] ou pour identifier des espaces de noms [Chapitre 4]. Les URL sont bien connues car elles sont utilisées au quotidien pour naviguer sur le WEB. La terminologie XML distingue également les URI et les URN. Les significations exactes de ces trois termes dans la terminologie XML sont les suivantes.

URI

Uniform Resource Identifier

URL

Uniform Resource Locator

URN

Uniform Resource Name

URI

Figure 2.1. Relations entre URI, URL et URN

La notion la plus générale est celle d'URI. Les URI comprennent les URL et les URN même si certains URI peuvent être simultanément des URL et des URN. Les liens entre ces différents termes sont illustrés à la figure. Un URI est un identifiant qui permet de désigner sans ambiguïté un document ou plus généralement une ressource. Cet identifiant doit donc être unique de manière universelle. Une URL identifie un document en spécifiant un mécanisme pour le retrouver. Elle est composée d'un protocole suivi d'une adresse permettant de récupérer le document avec le protocole. Un URN est, au contraire, un nom donné à un document indépendamment de la façon d'accéder au document. Un exemple typique d'URN est l'URN formé à partir du numéro ISBN d'un livre comme urn:isbn:978-2-7117-2077-4. Cet URN identifie le livre Langages formels, calculabilité et complexité mais n'indique pas comment l'obtenir.

La syntaxe générale des URI prend la forme scheme:ident où scheme est un schéma d'URI et où ident est un identifiant obéissant à une syntaxe propre au schéma scheme. Chaque schéma définit un sous-espace des URI. Dans le cas d'une URL, le schéma est un protocole d'accès au document comme http, sip, imap ou ldap. Le schéma utilisé pour tous les URN est urn. Il est généralement suivi de l'identificateur d'un espace de noms comme isbn. Des exemples d'URI sont donnés ci-dessous. Les deux derniers URI de la liste sont des URN.

Dans la pratique, la plupart des URI utilisées sont des URL et les deux termes peuvent (presque) être considérés comme synonymes.

2.3.1.     Résolution d'URI

Un URI appelé URI de base est souvent attaché à un document ou à un fragment d'un document XML. Cet URI est généralement une URL. Il sert à résoudre les URL contenues dans le fragment de document, qu'elles soient relatives ou absolues. Cette résolution consiste à combiner l'URL de base avec ces URL pour obtenir des URL absolues qui permettent de désigner des documents externes.

Pour comprendre comment une URL de base se combine avec une URL, il faut d'abord comprendre la structure d'une URL. La description donnée ci-dessous se limite aux aspects indispensables pour appréhender la résolution des URL. Chaque URL se décompose en trois parties.

Protocole d'accès

Une URL commence obligatoirement par le nom d'un protocole d'accès suivi du caractère ':'. Les principaux protocoles sont http, https, ftp et file.

Adresse Internet

Le protocole est suivi d'une adresse Internet qui commence par les deux caractères '//'. Cette adresse est absente dans le cas du protocole file.

Chemin d'accès

L'URL se termine par un chemin d'accès dans l'arborescence des fichiers. Ce chemin se décompose lui-même en le nom du répertoire et le nom du fichier. Ce dernier est formé de tous les caractères après le dernier caractère '/'.

Répert oire        Fichier

Prot ocole           Adresse Int ernet           Chem in d'accès

Répert oire        Fichier

Prot ocole           Chem in d'accès

Figure 2.2. Structure d'une URL

La combinaison d'une URL url avec une URL de base base pour former une URL complète est réalisée de la façon suivante qui dépend essentiellement de la forme de l'URL url.

  1. Si l'URL url est elle-même une URL complète qui commence par un protocole, le résultat de la combinaison est l'URL url sans tenir compte de l'URL base.
  2. Si l'URL url est un chemin absolu commençant par le caractère '/', le résultat est obtenu en remplaçant la partie chemin de l'URL base par l'URL url. L'URL url est donc ajoutée après la partie adresse Internet de l'URL base.
  3. Si l'URL url est un chemin relatif ne commençant pas par le caractère '/', le résultat est obtenu en remplaçant le nom du fichier de l'URL base par l'URL url. Le chemin relatif est donc concaténé avec le nom du répertoire.

2.4.        Syntaxe et structure

Il y a, en français, l'orthographe et la grammaire. La première est constituée de règles pour la bonne écriture   des mots. La seconde régit l'agencement des mots dans une phrase. Pour qu'une phrase en français soit correcte, il faut d'abord que les mots soient bien orthographiés et, ensuite, que la phrase soit bien construite. Il y aurait encore le niveau sémantique mais nous le laisserons de côté. XML a également ces deux niveaux. Pour qu'un document XML soir correct, il doit d'abord être bien formé et, ensuite, être  valide. La première contrainte est  de nature syntaxique. Un document bien formé doit respecter certaines règles syntaxiques propres à XML qui sont explicitées dans ce chapitre. Il s'agit, en quelque sorte, de l'orthographe d'XML. La seconde contrainte est de nature structurelle. Un document valide doit respecter un modèle de document. Un tel modèle décrit de manière rigoureuse comment doit être organisé le document. Un modèle de documents peut être vu comme une grammaire pour des documents XML. La différence essentielle avec le français est que la grammaire d'XML n'est pas figée. Pour chaque application, il est possible de choisir la grammaire la plus appropriée. Cette possibilité d'adapter la grammaire aux données confère une grande souplesse à XML. Il existe plusieurs langages pour écrire des modèles de document. Les DTD (Document Type Description), héritées de SGML, sont simples mais aussi assez limitées. Elles sont décrites au chapitre suivant [Chapitre 3]. Les schémas XML sont beaucoup plus puissants. Ils sont décrits dans un autre chapitre [Chapitre 5].



Un document XML est généralement contenu dans un fichier texte dont l'extension est .xml. Il peut aussi être réparti en plusieurs fichiers en utilisant les entités externes [Section 3.5.1.4] ou XInclude [Section 2.9]. Les fichiers contenant des documents dans un dialecte XML peuvent avoir une autre extension qui précise le format. Les extensions pour les schémas XML [Chapitre 5], les feuilles de style XSLT [Chapitre 8], les dessins en SVG [Chapitre 11] sont, par exemple, .xsd, .xsl et .svg.

Un document XML est, la plupart du temps, stocké dans un fichier mais il peut aussi être dématérialisé et exister indépendamment de tout fichier. Il peut, par exemple, exister au sein d'une application qui l'a construit. Une chaîne de traitement de documents XML peut produire des documents intermédiaires qui sont détruits à la fin. Ces documents existent uniquement pendant le traitement et sont jamais mis dans un fichier.

2.5.        Composition globale d'un document

La composition globale d'un document XML est immuable. Elle comprend toujours les constituants suivants. Prologue

Il contient des déclarations facultatives.

Corps du document

C'est le contenu même du document.

Commentaires et instructions de traitement

Ceux-ci peuvent apparaître partout dans le document, dans le prologue et le corps.

Le document se découpe en fait en deux parties consécutives qui sont le prologue et le corps. Les commentaires et les instructions de traitement sont ensuite librement insérés avant, après et à l'intérieur du prologue et du corps. La structure globale d'un document XML est la suivante.

 

...            

             Prologue

                          

...                         Corps

                        

Dans l'exemple donné au début de ce chapitre, le prologue comprend les trois premières lignes du fichier. La première ligne est l'entête XML et la deuxième est simplement un commentaire utilisé par Emacs pour mémoriser le nom du fichier et sa date de dernière modification. La troisième ligne est la déclaration d'une DTD externe contenue dans le fichier bibliography.dtd. Le corps du document commence à la quatrième ligne du fichier avec la balise ouvrante . Il se termine à la dernière ligne de celui-ci avec la balise fermante

.

2.6.        Prologue

Le prologue contient deux déclarations facultatives mais fortement conseillées ainsi que des commentaires [Section 2.7.5] et des instructions de traitement [Section 2.7.6]. La première déclaration est l'entête XML qui précise entre autre la version de XML et le codage du fichier. La seconde déclaration est la déclaration du type du document (DTD) qui définit la structure du document. La déclaration de type de document est omise lorsqu'on utilise des schémas XML [Chapitre 5] ou d'autres types de modèles qui remplacent les DTD. La structure globale du prologue est la suivante. Dans le prologue, tous les caractères d'espacement [Section 2.2.2] sont interchangeables mais l'entête est généralement placée, seule, sur la première ligne du fichier.

                     Entête  XML       

 

...                         DTD                       

]>                                                       

Les différentes parties du prologue sont détaillées dans les sections suivantes.

2.6.1.     Entête XML

L'entête utilise une syntaxe semblable à celle des instructions de traitement [Section 2.7.6] bien qu'elle ne soit pas véritablement une instruction de traitement. L'entête XML a la forme générale suivante.

 

L'entête doit se trouver au tout début du document. Ceci signifie que les trois caractères '

 

 

Lorsqu'un document est scindé en plusieurs fragments dans différents fichiers inclus par des entités externes [Section 3.5.1.4] ou par XInclude [Section 2.9], chacun des fragments peut commencer par une entête. L'intérêt est de pouvoir spécifier un codage des caractères différent.

2.6.2.     Déclaration de type de document

La déclaration de type définit la structure du document. Elle précise en particulier quels éléments peut contenir chacun des éléments. Cette déclaration de type peut prendre plusieurs formes suivant que la définition du type est interne, c'est-à-dire incluse dans le document ou externe. Elle a la forme générale suivante qui utilise le mot clé DOCTYPE.

 

La forme précise de cette déclaration est explicitée au chapitre consacré aux DTD [Chapitre 3].

2.7.        Corps du document

Le corps du document est constitué de son contenu qui est organisé de façon hiérarchique à la manière d'un système de fichiers à l'exception qu'aucune distinction n'est faite entre fichiers et répertoires. L'unité de cette organisation est l'élément. Chaque élément peut contenir du texte simple, comme un fichier, d'autres éléments, comme un répertoire, ou encore un mélange des deux.

Comme dans une arborescence de fichiers, il y a un élément appelé élément racine qui contient l'intégralité du document.

2.7.1.     Éléments

Cont enu de l'élém ent n a me

Figure 2.3. Composition d'un élément

Un élément est formé d'une balise ouvrante, d'un contenu et de la balise fermante correspondante. La balise ouvrante prend la forme formée du caractère '<' U+3C, du nom name de l'élément et du caractère '>' U+3E. Des attributs [Section 2.7.3] peuvent éventuellement être ajoutés entre le nom et le caractère '>'. La balise fermante prend la forme formée des deux caractères ''. Les noms des éléments sont des noms XML [Section 2.2.3] quelconques. Ils ne sont pas limités à un ensemble fixé de noms prédéfinis comme en HTML. Le contenu d'un élément est formé de tout ce qui se trouve entre la balise ouvrante et la balise fermante (cf. figure). Il peut être constitué de texte, d'autres éléments, de commentaires [Section 2.7.5] et d'instructions de traitement [Section 2.7.6].

 Dans la balise ouvrante, le caractère '<' doit être immédiatement suivi du nom de l'élément. En revanche, il peut y avoir des espaces entre le nom et le caractère '>'. La balise fermante ne peut pas contenir d'espace.

ou

Cont enu vide



168