1. Format XML

1-A. Notions générales

1-A-1. Historique

XML est une recommandation du W3C, 10 février 1998 .Il est né du succès du HTML mais aussi de la constatation de ses insuffisances .Comme ce dernier , XML est issue du langage de balise SGML et en est une simplification. Là où HTML est spécialisé dans l'affichage, XML lui se spécialise dans la donnée.

1-A-2. Caractéristiques

Si nous reprenons sa dénomination, eXtensible Markup Language :

  • Language : interprété, notion de sémantique ;
  • Markup : balise, les symboles utilisés pour délimiter les mots de ce langage ;
  • extensible : métalangage, équivalent à une liste de phonèmes, plus des règles de ponctuation.

Les objectifs de conception de XML , listés dans sa spécification, sont les suivants :

  1. XML devrait pouvoir être utilisé sans difficulté sur Internet ;
  2. XML devrait soutenir une grande variété d'applications ;
  3. XML devra être compatible avec SGML ;
  4. il devrait être facile d'écrire des programmes traitant les documents XML ;
  5. le nombre d'options dans XML doit être réduit au minimum, idéalement à aucune ;
  6. les documents XML devraient être lisibles par l'homme et raisonnablement clairs ;
  7. la conception de XML devrait être préparée rapidement ;
  8. la conception de XML sera formelle et concise ;
  9. il devrait être facile de créer des documents XML ;
  10. la concision dans le balisage de XML est de peu d'importance.

1-A-3. Usages

Une liste non exhaustive de ses différentes utilisations :

  • formats d'échange/extraction de données (une des plus anciennes) ;
  • formats de document (open XML, opendDocument, RSS,XBRL...) ;
  • formats de langage descriptif :XHTML,math ml,svg... ;
  • sauvegarde de donnée (du fichier de configuration à la base de données XML native...).

1-B. Éléments constitutifs d'un XML

1-B-1. L'en-tête

Un document XML devrait toujours commencer par un en-tête.

L'en-tête minimum :
Sélectionnez
<?xml version="1.0"?>

version représente la version de XML utilisée

NB: il existe d'autres versions que la 1.0 mais quasi inutilisées.

Cet en-tête peut être complété par l'encodage qui est utilisé pour la lecture

 
Sélectionnez
<?xml version="1.0" encoding="ISO-8859-1"?>

Si cet encoding n'est pas précisé UTF-8 sera utilisé par défaut.

Un autre élément facultatif standalone

Cet élément signale si le XML en lui seul est suffisant pour être lu ou s'il nécessite l'adjonction d'un autre document externe (DTD). Ce point sera abordé plus en détail dans la partie des entités.

La valeur par défaut de standalone est yes

 
Sélectionnez
<?xml version="1.0" standalone='yes'?>

1-B-2. Les balises, appelées éléments

Les balises, dites éléments, sont l'autre partie obligatoire d'un XML, c'est le type de base du XML, celui qui va permettre de créer l'arborescence.

Pour tout élément avec contenu, une balise de début et de fin sont obligatoires.

 
Sélectionnez
<nom_balise>contenu_balise</nom_balise>

Pour un élément sans contenu on peut utiliser une écriture raccourcie

Élément vide
Sélectionnez
<nom_balise/>

le nom de la balise suit aussi des règles:

Pour le premier caractère on autorise uniquement : les lettres (même accentuées), ':' et '_ ' ;

pour les caractères suivants on ajoute à cette liste:les chiffres, '- ' et '.' ;

un élément peut soit contenir du texte, soit d'autres éléments soit un mélange des deux (le XHTML est un bon exemple de ce dernier cas) ;

pour ce qui est du texte certains caractères sont interdits . Ainsi < et > seront remplacés par leur référence &lt; et &gt; ;

à la suite de l'en-tête, on ne doit trouver qu'une unique balise qu'on appellera élément racine.

Ainsi ce code est faux :

xml
Sélectionnez
<?xml version="1.0"?> 
<racine> 
    ...
</racine> 
<racine2> 
    ...
</racine2>

le XML minimum serait donc de la forme :

xml
Sélectionnez
<?xml version="1.0"?> 
<ElementRacine/>

Les balises ne peuvent se superposer.

Ce code est exact:

xml
Sélectionnez
<?xml version="1.0"?> 
<racine> 
    <a> 
        <b/> 
        <c/> 
    </a> 
</racine>

Ce code est faux :

xml
Sélectionnez
<?xml version="1.0"?> 
<racine> 
    <a> 
        <b> 
        <c> 
        </b> 
        </c> 
    </a> 
</racine>

1-B-3. Attribut

Un élément peut être porteur d'un ou plusieurs attributs.

xml
Sélectionnez
<Element att1="test1" att2="test2">...</Element>

Ici Element est porteur de deux attributs att1 et att2.

Les noms des attributs suivent les mêmes règles d'écriture que ceux des éléments.

Les attributs ne peuvent contenir que du texte.

Un élément ne peut posséder deux attributs de même nom, ainsi le code suivant est faux

xml
Sélectionnez
<Element att1="test1" att1="test2">...</Element>

1-B-4. namespace

Les namespaces (espaces de nom) sont la solution trouvée au problème des balises homonymes.

En effet, XML étant un métalangage, deux concepteurs peuvent avoir fait les mêmes choix de noms de balises sans que leurs interprétations soient identiques. Il est en effet fréquent de trouver des XML composés de plusieurs langages ou formats.

Un namespace se présente sous la forme d'un « attribut » xmlns (XMLnamespace) suivi d'une URI.

Un namespace peut se déclarer tel quel, dans ce cas, toutes les balises contenues dans la balise porteuse, et qui ne sont pas porteuses d'un autre namespace, seront considérées comme incluses dans l'espace de nom.

Soit :

xml
Sélectionnez
<?xml version="1.0"?> 
<racine> 
    <a xmlns="NStest1"> 
        <b> 
            <c/> 
        </b> 
        <d xmlns="NStest2"/> 
    </a> 
    <e/> 
</racine>

Les balises a, b, c appartiennent à l'espace de nom Nstest1.

La balise d appartient à l'espace de nom Nstest2.

Les balises racine et e n'appartiennent à aucun de ces deux namespaces. Deuxième façon de procéder, l'utilisation d'un préfixe. Dans la déclaration du namespace on fait alors suivre xmlns du préfixe choisi. Toutes les balises contenues dans la balise où il est déclaré (y compris cette dernière), porteuses du préfixe, appartiendront alors au namespace.L'usage et la commodité veulent que ce soit dans le premier élément du XML qu'apparaissent les namespaces.

xml
Sélectionnez
<?xml version="1.0"?> 
<racine xmlns:t1="NStest1" xmlns:t2="NStest2"> 
    <t1:a> 
        <b> 
            <t1:c/> 
        </b> 
        <d/> 
    </t1:a> 
    <t2:e/> 
</racine>

les balises a et c appartiennent à l'espace de nom Nstest1.

la balise e appartient à l'espace de nom Nstest2.

les balises racine,b et d n'appartiennent à aucun de ces deux namespaces.

1-B-5. CDATA

Plutôt que de modifier un par un les &,< et > du texte d'une balise, on peut utiliser les CDATA. Tout &,< ou > contenu dans un CDATA est alors interprété comme un &amp;,&lt; ou &gt;

xml
Sélectionnez
<?xml version="1.0"?> 
<racine><![CDATA[exemple du contenu d'un CDATA avec des < et >]]></racine>

Attention, toute balise placée dans un CDATA sera considérée comme du texte.

Si on est face à une balise à contenu mixte il faudra donc opter pour une solution de ce type :

xml
Sélectionnez
<?xml version="1.0"?> 
<racine> 
<![CDATA[exemple du contenu d'un CDATA avec des < et >]]>
<a>...</a> 
<![CDATA[suite avec < et >]]>
</racine>

1-B-6. Commentaires

Comme en HTML, il est possible de faire des commentaires dans du XML.

Ceux-ci doivent se situer après l'en-tête. Ils peuvent être imbriqués entre des éléments exactement comme des balises.

Un commentaire commence par <!-- et se termine par -->.

xml
Sélectionnez
<?xml version="1.0"?> 
<!--exemple de commentaires après l'en-tête--> 
<racine> 
    <!--exemple de commentaires imbriqués dans des éléments--> 
    <a>..</a> 
    <b>...</b> 
</racine> 
<!--exemple de commentaires après l'élément racine-->

1-B-7. processing-instruction

Les processing-instructions sont le moyen d'envoyer des ordres à l'outil qui lit le XML, généralement le parseur.

Une processing-instruction commence par <? et se termine par ?>. L'en-tête est un exemple de processing-instruction.

Plus loin dans le cours, on les utilisera aussi pour lier une feuille XSLT à un XML.

1-B-8. Les entités

La norme XML a entre autres comme but l'échange de données, elle nécessite un outil de validation.Elle a hérité en ce sens du SGML des DTD (document type declaration) et comme SGML, une DTD peut être incluse à ce titre dans le XML.
Pour qu'un XML soit bien formé, la DTD doit impérativement être déclarée avant le premier élément, comme suit.

 
Sélectionnez

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
  <!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello, world!</greeting>

Le mécanisme des DTD permet l'utilisation des entités références.Un entité références fonctionne comme une mutalisation de chaine de caractères. Exemple :

 
Sélectionnez

<?xml version="1.0"?>
<!DOCTYPE racine [
  <!ENTITY hel "hello world!!!">
 
]>
<racine>&hel;</racine>

est équivalente à :

 
Sélectionnez

<?xml version="1.0"?>
<racine>hello world!!!</racine>

L'attribut standalone de l'en-tête vu précédemment doit être à no si le XML utilise ce système d'entité avec une DTD externe.

Je ne saurais que vivement déconseiller ceci et en particulier l'utilisation des entités externes. Conçu bien avant l'explosion du net, il comporte d'énormes failles de sécurité qui rendent aisées des attaques par dénis de service.
Voir Sécurité applicative : Attaque de Déni de Service via DTD/XML Attaque de Déni de Service via DTD/XML pour plus de détails.

1-C. Récapitulatif sur la construction d'un XML

Les principales règles sur un XML sont :

  1. Un en-tête indiquant la version (certains outils la considérant obligatoire mieux vaut toujours la servir) ;
  2. Un seul élément racine ;
  3. Toute balise ouverte doit être refermée ;
  4. Pas de recouvrement de balises ;
  5. Une balise ne peut pas posséder deux attributs de même nom ;
  6. Les &,< et > non compris dans un CDATA doivent être remplacés par &amp;,&lt; et &gt;.

Un document respectant toutes les règles de construction est dit bien formé, il pourra alors utiliser tous les outils à la disposition de XML.

2. La galaxie XML

Un des termes descriptifs utilisés pour les technologies XML est celui de galaxie avec XML en son centre et différentes étoiles voir amas qui s'éloignent suivant une logique de cercles.

Les détracteurs de XML pourront sans aucun doute faire remarquer que c'est une description qui se rapprocherait plus de celle de l'enfer de Dante.

Au centre

XML

Premier Cercle

parcours/lecture : parseur(DOM, SAX...)

deuxième Cercle

La grammaire/validation : DTD, XML Schema, Relax NG...

Troisième Cercle

La sélection :Xpath

La transformation et requête : XSLT, XQUERY, DOM

Quatrième Cercle

les liens : Xlink, Xinclude, XPointer...

Cinquième Cercle

Producteur/porteur de XML : Xforms, XSQL, SOAP

Sixième Cercle

Les langages descriptifs de format XML : Open document, SVG, RSS, MathML, XBRL...

Septième Cercle

Métalangage au service des métadonnées : RDF

2-A. Les parseurs

Un XML, c'est avant tout un fichier ou un flux texte. S'il doit être utilisé par un langage, celui-ci doit choisir la façon de le stocker en mémoire et de le parcourir, c'est le rôle d'un parseur.

Cet outil logiciel,parfois un analyseur syntaxique, permet à une application cliente de valider (s'il est validant) un document XML et de le lire, voire de le modifier. Un parseur met à disposition de l'application cliente les données XML lues au travers d'API, les plus répandues étant SAX et DOM. Une autre catégorie , plus récente, intègre une technologie PULL, associant les avantages de SAX - définie comme une technologie PUSH - et DOM sans leurs inconvénients.

2-A-1. DOM

DOM ( Document Object Model ) est une API permettant d'accéder au contenu d'un document XML sous la forme d'une structure arborescente. Le document XML, après avoir été totalement chargé en mémoire, est accessible au travers d'un ensemble d'objets correspondant aux différents types de nœuds qui s'y trouvent, et exposant les méthodes permettant de parcourir l'arbre, de façon hiérarchique ou transversale. L'approche diffère donc totalement de celle de SAX, bien qu'un arbre DOM puisse être construit en utilisant ce dernier. DOM est une recommandation du W3C, proposée en plusieurs versions (level) proposant des fonctionnalités croissantes et dont la compatibilité est ascendante ; Le level 1 est devenue une recommandation le 1er octobre 98, le level 2 (XML) le 13 novembre 2000 et tous les derniers éléments du level 3 sont des recommandations depuis avril 2004. Il existe des implémentations de DOM dans pratiquement tous les langages interprétés ou compilés existants pouvant lire des documents XML.

2-A-2. SAX

SAX ( Simple API for XML ) est une API basée sur un modèle événementiel, qui transforme un document XML en un flux d'événements déclenchés par la lecture d'éléments syntaxiques XML (balise ouvrante, balise fermante, etc.). Le modèle est quelque peu calqué sur celui des interfaces graphiques, l'application cliente devenant un "écouteur d'événement". SAX a comme

avantage, grâce à son fonctionnement, de ne lire le code que par petites portions, ce qui lui évite de le charger en mémoire intégralement, contrairement à DOM. Il est donc très intéressant pour la lecture des gros documents. Il ne sera par contre pas adapté aux cas où l'application cliente ne peut pas se contenter d'un parcours linéaire et par "petits bouts" du document XML.

2-A-3. Autres

STAX ( Streaming API for XML ) est un exemple d'API Java Pull implémentée par des parseurs de BEA et Sun.

http://www.jcp.org/en/jsr/detail?id=173

De plus le modèle objet de DOM a subi de nombreuses critiques : trop lourd, trop complexe et ne satisfaisant pas une optique objet.

Il existe donc de nombreuses bibliothèques, particulièrement en JAVA (JDOM) et en PHP

(SimpleXML...) qui tout en s'appuyant sur ces modèles offrent des interfaces très différentes.

2-B. La validation

En décrivant au début de ce cours les règles du format XML, nous avons décrit les conditions nécessaires pour qu'un XML soit bien formé. C'est la condition indispensable pour qu'un document puisse utiliser les différents outils du monde XML, il n'est autrement qu'un fichier texte rempli de balises.

Néanmoins ceci reste insuffisant, en effet qu'un document XML soit utilisé comme un langage ou comme un format d'échange, il est soumis dans chacun des cas à des contraintes syntaxiques.

En règle générale les principales contraintes sont :

  • nom des éléments et des attributs autorisés ;
  • hiérarchie(père/fils) et appartenance des éléments et attributs ;
  • séquencement et itérations des éléments ;
  • contraintes d'unicités et de référence.

C'est le parseur , à l'aide d'un document décrivant la grammaire exigée, qui se chargera de ce travail; on parle alors de parseur validant. La validation consiste donc à comparer, lors de la lecture d'un document XML par le parseur validant, la structure du fichier XML avec la grammaire fournie. On considérera le XML valide si les deux concordent.

Les principaux langages de validation sont :

  • les DTD: c'est le plus ancien, il est antérieur au XML, c'est aussi un des plus restreints en termes de contraintes pouvant être exprimées ;
  • XML Schema: la norme syntaxique fournie par le W3C, permet un très grand choix de contraintes et de types mais souvent considéré comme trop complexe. Sans doute le langage le plus utilisé avec les DTD ;
  • Relax NG: l' équivalent de XML Schema mais proposé par OASIS. Il sert de base au document de Open Office. Plus souple que XML Schema mais néanmoins moins implémenté ;
  • Schematron : schematron n'est pas un langage validant «complet », il est généralement utilisé en complément d'un des précédents cités. Là où les autres sont principalement orientés vers des contraintes structurelles, lui est plus orienté « sémantique » en permettant d'en ajouter sur les valeurs des éléments et des attributs.

2-C. Sélection,transformation,requête

La sélection :

XPath est un langage avec une syntaxe non XML, permettant d'adresser les différents nœuds ou groupes de nœuds particuliers d'un document XML.

Contrairement à un langage de sélection comme SQL, il ne permet pas, en dehors de certaines opérations arithmétiques ou concernant les chaînes, de transformer la structure des données.

La transformation :

XSLT : langage de forme XML. Basé sur un système de templates, il permet de transformer un flux XML soit en un autre flux XML,soit HTML ou simplement texte

La requête :

Xquery : langage qui n'utilise pas la forme XML. Il permet à partir d'un ou plusieurs documents XML de reconstruire un nouveau XML

2-D. Les liens

Xlink, Xpointer : essentiellement basés sur Xpath et un ensemble d'attributs, ils permettent de créer des liens entre différents éléments d'un même document ou au travers d'autres. Ces technologies sont peu utilisées et implémentées isolément. On les retrouve surtout au sein d'API comme COCOON traitant du XML ou de langages comme XBRL

2-E. Echanges XML

SOAP : protocole RPC, particulièrement utilisé dans les Web Services. Il consiste en un fichier XML en deux parties :

  • l'enveloppe : qui contient les informations sur le message lui-même ;
  • un modèle de données : les informations transmises.

XSQL : langage développé par Oracle. Il consiste en un fichier de format XML contenant une requête SQL dans une première partie et la présentation XML désirée des données récupérées dans la seconde. Il est atteignable via des requêtes HTTP .

XFORMS : un nouveau type de formulaires pour le Web. En découpant les formulaires traditionnels XHTML en trois parties — le modèle XForms, les données d'instance et l'interface d'utilisateur*— XForms sépare la présentation du contenu, permet la réutilisation, apporte un typage fort, tout en réduisant les allers-retours au serveur comme en offrant une indépendance par rapport au matériel et en limitant les recours à des scripts.Il permet l'envoi pré-formaté de données soit sous forme d'une string, soit sous la forme d'un XML.

2-F. Langages descriptifs

XML est principalement utilisé dans des langages descriptifs, quelques exemples parmi la multitude:

XHTML : version XML du format HTML ;

OpenDocument : format XML utilisé par OOo ;

OpenXml :format utilisé par la suite Microsoft office ;

RSS : fyndication de contenus web ;

SVG : format de description d'image vectorielle ;

MathML : format de description de formules mathématiques ;

XBRL : format de description de données financières ;

2-G. Méta données

RDF,OWL: format de liens de métadonnées. Ils permettent d'indexer et de renseigner des structures d'informations de natures et formats divers, et de permettre par là un traitement applicatif