Accueil
 chercher             Plan du site             Info (English version) 
L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.Les listes de discussions XMLfr sont à votre disposition pour réagir sur nos articles ou simplement poser une question.Si vous ètes passionnée(e) par XML, pourquoi ne pas en faire votre métier ?XMLfr n'est heureusement pas le seul site où l'on parle de XML. Découvrez les autres grâce à XMLfr et à l'ODP.Les partenaires grâce auxquels XMLfr peut se développer.Pour tout savoir sur XMLfr.XMLfr sans fil, c'est possible !Pour ceux qui veulent vraiment en savoir plus sur XML.L'index du site.
 Si vous vous posez une question, vous n'êtes peut-être pas le premier...Les traductions en français des bibles XML.Ces articles sont des références dans leur domaine.Tout ce qu'il faut savoir pour démarrer sur un sujet XML...


Introduction aux espaces de noms XML

Les espaces de noms XML (namespaces en anglais) sont une des spécifications XML les plus simples mais également les plus mal comprises.

Eric van der Vlist, Dyomedea (vdv@dyomedea.com).
lundi 12 septembre 2005

Table des matières

Introduction

Principes

Système d'identification

Syntaxe

Espace de noms par défaut

Définition de préfixes

Éléments sans espace de noms

Cas des attributs

Deux éléments ayant le même nom et des espaces de noms différents sont-ils identiques?

Conclusion

Références

Introduction

La notion d'espaces de noms est une notion très générale qui dépasse le cadre des technologies XML. Wikipédia en donne la définition suivante :

"Un espace de noms est un ensemble de ce qui est désignable dans un contexte donné par une méthode d'accès donnée faisant usage de noms symboliques (par exemple des chaînes de caractères avec ou sans restriction d'écriture). Pour prendre un exemple simple, si vous avez sous les yeux un annuaire téléphonique, l'espace de noms associé est celui des abonnés au téléphone du département concerné (du moins ceux qui ne sont pas en liste rouge)."

Un autre exemple simple est celui des noms et prénoms. Un prénom suffit généralement à identifier une personne dans sa proche famille. Par contre, pour l'identifier en dehors de ce cadre restreint, il faudra ajouter son nom de famille. Cet exemple est imparfait puisque prénoms et noms de famille ne suffisent pas à identifier une personne, mais dans son principe il illustre bien le problème des espaces de noms.

Dans le cas de XML, il s'agit de désigner (ou d'identifier) les noms d'éléments et d'attributs XML dans le contexte d'un document XML.

Tout comme les sources de programmes informatiques, les documents XML sont "auto-documentés", c'est à dire qu'on peut les lire sans avoir besoin de se référer à d'autres documents.

Pour favoriser la lisibilité des documents XML, on conseille généralement d'utiliser des noms d'éléments et d'attributs issus du langage naturel et décrivant la nature et la fonction des informations qu'ils contiennent.

Il est donc très fréquent que des vocabulaires XML différents utilisent les mêmes noms pour des éléments et attributs pouvant avoir des fonctions et des contenus différents.

On retrouve par exemple très fréquemment des noms tels que "name" ou "nom", "title" ou "titre", "description", "quantity" ou "quantité", ...

Pour pouvoir comprendre la signification d'un élément ou d'un attribut, il est donc nécessaire de pouvoir spécifier à quel vocabulaire il appartient et c'est l'objectif de la recommandation W3C "Namespaces In XML" [vf (1.0)] [vo (1.1)].

Cette recommandation s'est donnée la contrainte supplémentaire de permettre l'utilisation simultanée d'éléments et d'attributs provenant de plusieurs espaces de noms dans un même document XML.

Cette contrainte complique le problème : il ne s'agit pas d'identifier un "type de document" comme on sait le faire depuis SGML au moyen d'une déclaration de type de document placée en début de document mais bien d'identifier, élément par élément et attribut par attribut, le vocabulaire auquel il appartient.

Elle est motivée par des considérations de modularité et de réutilisation des espaces de noms, les éditeurs de la spécification expliquant:

"Nous envisageons des applications du Langage de Balisage Extensible (XML) où un seul document XML peut contenir des éléments et des attributs (regroupés ici sous l'intitulé "vocabulaire de balisage") qui sont définis et utilisés par plusieurs modules logiciels. Une raison pour ceci : la modularité ; si un tel vocabulaire de balisage existe, bien compris et pour lequel des logiciels pratiques sont disponibles, il est préférable de ré-employer ce balisage plutôt que de le ré-inventer."

Si l'on revient à notre exemple des prénoms et noms de famille, cela revient à dire que dans un document XML, on veut pouvoir mettre en scène des personnes appartenant à plusieurs familles!

Principes

Système d'identification

Dans la vision du W3C, XML est avant tout destiné au Web et les espaces de noms sont assimilables à des "ressources" Web.

Pour les identifier, le W3C a donc très naturellement choisi d'utiliser les identificateurs du Web, c'est à dire les URI (Uniform Resource Identifiers).

Cette utilisation d'URI pour identifier un espace de noms est la principale source de confusion (et de polémique) autour des espaces de noms et elle mérite quelques explications.

Pour identifier un espace de noms, il est possible d'utiliser un URI de type URN (Uniform Resource Name) tel que "urn:oasis:names:tc:entity:xmlns:xml:catalog". Un URN étant, par définition, un nom il n'y a dans ce cas pas de confusion possible et il ne viendrait à personne l'idée d'essayer d'accéder à une page web ayant cette adresse.

Les choses seraient donc simples s'il n'était pas également possible d'utiliser une URL (Uniform Resource Locator) telle que "http://www.w3.org/1999/xhtml" pour identifier un espace de noms.

Cette possibilité pose un problème de principe : l'URL "http://www.w3.org/1999/xhtml" identifie l'espace de noms "XHTML" au sens de la recommandation des espaces de noms XML mais c'est également une URL; c'est à dire l'adresse d'une page web que je peux ouvrir dans mon navigateur et elle identifie également cette page Web.

L'utilisation d'une URL pour identifier un espace de noms est donc un détournement comparable à l'utilisation d'un numéro de téléphone ou d'une adresse email pour identifier une personne : on peut certes m'identifier sans trop de risque par mon adresse email "vdv@dyomedea.com" mais, fondamentalement, je suis un individu et non une adresse email.

C'est pour esquiver cette question que les éditeurs de la recommandation écrivent qu'un espace de noms est identifié par une "référence d'URI" et non par une "URI".

Cette formule qui ne contribue pas à améliorer la clarté de la recommandation signifie que c'est la chaîne de caractères représentant l'URI (c'est à dire "urn:oasis:names:tc:entity:xmlns:xml:catalog" ou "http://www.w3.org/1999/xhtml") qui identifie l'espace de noms et non l'URI en tant que tel. Cela reviendrait à dire que c'est la chaîne de caractères "vdv@dyomedea.com" qui m'identifie et non l'adresse email en tant que telle.

En pratique, cela dissocie totalement l'espace de noms identifié par une URL de la ressource dont c'est l'adresse.

On y trouve donc la réponse à la question la plus fréquente à propos des espaces de noms : la page "http://www.w3.org/1999/xhtml" n'a pas besoin d'exister pour que l'on puisse définir un espace de noms identifié par "http://www.w3.org/1999/xhtml" et si elle existe, elle peut contenir absolument n'importe quelle type de ressource et n'avoir éventuellement aucun rapport avec l'espace de noms.

En pratique, il est tout de même conseillé de fournir à cette adresse une explication et des pointeurs vers des ressources décrivant cet espace de noms, mais ce n'est nullement imposé par la recommandation.

Dans tous les cas, les applications XML n'auront aucun besoin d'accéder à cette adresse et pourront continuer de fonctionner même "hors ligne" ou lorsque la ressource est indisponible.

Syntaxe

Répéter l'URI identifiant un espace de noms à propos de chaque élément et de chaque attribut serait verbeux et peu lisible. Pour éviter cela, la recommandation a prévu un mécanisme permettant de déclarer un espace de noms par défaut et des préfixes.

Espace de noms par défaut

La manière la plus simple d'utiliser les espaces de noms est de déclarer un espace de noms par défaut, qui s'applique à l'élément dans lequel il est déclaré et à tous les éléments qui y sont inclus (directement ou indirectement) par défaut, c'est à dire sauf indication contraire.

C'est ce que l'on utilise par exemple en XHTML lorsque l'on écrit :

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
      <title>Ma page</title>
      .../...
</head>
.../...
</html>

La déclaration de l'espace de noms par défaut se fait au moyen de l'attribut "xmlns" et elle s'applique à l'élément "html" dans lequel elle est effectuée et à tous ses descendants (c'est à dire les éléments qui y sont inclus).

Ici, l'élément "html" est l'élément racine du document et l'espace de noms par défaut s'applique à tout le document.

Il est possible de changer à tout moment d'espace de noms par défaut. Par exemple, pour inclure un dessin SVG dans un document XHTML, on écrira :

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Rectangle SVG</title>
    </head>
    <body>
        <h1>Rectangle</h1>
        <svg xmlns="http://www.w3.org/2000/svg" version="1.0" wid
th="100px">
            <rect y="6px" x="5px" width="80px" height="40px" styl
e="stroke: #0000FF; fill: #FF0000"
            />
        </svg>
    </body>
</html>

L'espace de noms XHTML s'appliquera aux éléments html, head, title, body et h1 et l'espace de noms SVG s'appliquera aux éléments svg et rect.

Définition de préfixes

Certaines applications utilisent plusieurs espaces de noms de manière très imbriquée, ce qui rendrait très verbeuse l'utilisation des espaces de noms par défaut. C'est le cas par exemple des vocabulaires OpenOffice et RSS 1.0.

Pour faire face à ces cas de figure, la recommandation permet également de définir des préfixes associés aux espaces de noms.

Le canal RSS 1.0 de XMLfr commence de la manière suivante :

<rdf:RDF 
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
   xmlns:rss="http://purl.org/rss/1.0/"
   xmlns:rss091="http://purl.org/rss/1.0/modules/rss091#"
   xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
   xmlns="http://purl.org/rss/1.0/">
   <channel rdf:about="http://xmlfr.org/actualites/channel.rss10"
>
      <title>XMLfr</title>
      <link>http://xmlfr.org/actualites/</link>
      <description>Actualit&#233;s de XML</description>
      <dc:source rdf:resource="http://xmlfr.org/"/>
      <dc:language>fr</dc:language>
      <dc:publisher>Eric van der Vlist (mailto:vdv@dyomedea.com)<
/dc:publisher>
      <dc:creator>Eric van der Vlist (mailto:vdv@dyomedea.com)</d
c:creator>
      <dc:rights>Tous droits r&#233;serv&#233;s.</dc:rights>
      <image rdf:resource="http://xmlfr.org/bandeaux/xmlfr_88x31.
gif"/>
      <textinput rdf:resource="http://xmlfr.org/actualites/abonne
ment.xml"/>
      <items>
         <rdf:Seq>
            <rdf:li rdf:resource="http://xmlfr.org/actualites/dec
id/050728-0001"/>
            <rdf:li rdf:resource="http://xmlfr.org/actualites/tec
h/050720-0001"/>
.../...
         </rdf:Seq>
      </items>
   </channel>
...

Dans son élément racine, on trouve à la fois une déclaration d'espace de noms par défaut :

    xmlns="http://purl.org/rss/1.0/"

ainsi que des déclarations de préfixes :

   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
...

Ces déclarations associent le préfixe qui suit le "xmlns:" (ici "dc" ou "rdf") à l'URI donné en valeur.

Les préfixes sont ensuite utilisés devant les noms d'éléments ou d'attributs : " rdf:RDF" désigne l'élément "RDF" de l'espace de noms identifié par l'URI associé au préfixe "rdf", c'est à dire "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "dc:creator" désigne l'espace de noms identifié par l'URL associé au préfixe "dc", c'est à dire "http://purl.org/dc/elements/1.1/", ...

Comme c'est le cas pour la déclaration de l'espace de noms par défaut, les préfixes sont valables dans l'élément dans lequel ils sont définis et dans tout ces descendants.

La valeur de ces préfixes n'a pour une application XML aucune signification particulière et les éléments suivants sont considérés comme équivalents :

<dc:language
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   >fr</dc:language>
<x:language
   xmlns:x="http://purl.org/dc/elements/1.1/"
   >fr</x:language>
<language
   xmlns="http://purl.org/dc/elements/1.1/"
   >fr</language>
<rdf:language
   xmlns:rdf="http://purl.org/dc/elements/1.1/"
   >fr</rdf:language>

Si une application conforme à la recommandation ne fait aucune différence entre ces quatre possibilités, il n'en va pas de même des lecteurs humains qui pourront se laisser abuser par l'utilisation d'un préfixe inhabituel (comme ici l'utilisation du préfixe "rdf" associé à l'espace de noms Dublin Core) et il est conseillé d'utiliser un préfixe "habituel" (rdf pour RDF, dc pour Dublin Core, xsl pour XSLT, xs pour W3C XML Schema, ...).

Éléments sans espace de noms

La recommandation "espaces de noms XML" est bâtie au dessus de la recommandation XML et elle n'a aucun caractère obligatoire.

Il est donc tout à fait possible d'écrire des documents XML qui ne respectent pas la recommandation des espaces de noms, par exemple en ne respectant pas les règles d'utilisation des deux points dans les noms imposées par les espaces de noms et en écrivant :

<mon:élément:a:moi>héhé</mon:élément:a:moi>

Il est possible d'écrire des documents XML respectant la recommandation mais n'utilisant aucun espace de noms, par exemple :

<mon.élément.a.moi>héhé</mon.élément.a.moi>

Enfin, il est également possible d'insérer dans un document utilisant des espaces de noms, des éléments n'ayant aucun espace de noms, par exemple :

<mon.élément.a.moi>
  <sous-élément xmlns="http://ns.xmlfr.org/exemple/"> héhé </sous
-élément>
</mon.élément.a.moi>

ou

<racine xmlns="http://ns.xmlfr.org/exemple/">
  <mon.élément.a.moi xmlns="">héhé</mon.élément.a.moi>
</racine>

Dans ces deux exemples; l'élément "mon.élément.a.moi" n'appartient à aucun espace de noms. Dans le premier cas parce que l'espace de noms par défaut n'a pas encore été défini et qu'il n'y en a donc pas et dans le second pas parce que l'espace de noms par défaut à été affecté à une chaîne vide (xmlns="") et que cela a pour effet "d'effacer" sa définition.

Cas des attributs

Et les attributs dans tout cela? J'ai été volontairement discret sur les attributs parce que je voulais vous familiariser avec les différents cas de figure avant de mentionner cette exception qui ne pose généralement pas de problèmes (du moins tant que l'on n'aborde pas XSLT ou W3C XML Schema...).

Contrairement à ce que l'on pourrait penser, l'espace de noms par défaut ne s'applique pas au attributs et la plupart des attributs n'ont tout simplement pas d'espace de noms!

Revenons à notre exemple SVG :

<svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="100p
x">
   <rect y="6px" x="5px" width="80px" height="40px" style="stroke
: #0000FF; fill: #FF0000"/>
</svg>

Un espace de noms par défaut est déclaré dans l'élément "svg". Il va s'appliquer à l'élément "svg" lui-même et à tout ses descendants (ici l'élément "rect" qui fera donc partie de cet espace de noms). Par contre, il ne s'appliquera pas aux attributs, et les attributs "width" (de "svg" et de "rect"), "y", "x", "height" et "style" n'auront donc aucun espace de noms.

La raison en est que l'on considère que les attributs décrivent des propriétés de l'élément dans lequel ils sont placés et qu'ils n'ont pas besoin d'appartenir à un espace de noms pour y être rattachés. Ainsi, on considérera que l'attribut "width" étant dans un élément de l'espace de noms SVG appartient naturellement au même vocabulaire.

C'est au contraire lorsque l'on voudra montrer que l'on inclut dans un élément un attribut "étranger" appartenant à un autre espace de noms que l'on affectera un espace de noms à un attribut comme c'est le cas dans notre document RSS :

    <channel rdf:about="http://xmlfr.org/actualites/channel.rss10
">

Dans ce cas de figure, ont veut mettre en évidence le fait que l'attribut "about" appartient à l'espace de noms RDF bien qu'il soit inclus dans un élément de l'espace de noms par défaut RSS.

Deux éléments ayant le même nom et des espaces de noms différents sont-ils identiques?

C'est bien beau tout cela me direz-vous, mais quelles conséquences en tirer? Que peut-on dire par exemple des différences entre les éléments <a xmlns="http://www.w3.org/1999/xhtml">, <a xmlns="urn:un:truc"> et <a xmlns="">?

Ces éléments ont le même nom mais ils appartiennent à des espaces de noms différents. Ils doivent donc être considérés comme des éléments totalement différents dont le seul point commun est d'avoir le même nom, tout comme deux "Eric" ayant des noms de famille différents n'ont d'autre point commun que d'avoir le même prénom.

Les applications qui gèrent les espaces de noms doivent donc identifier les éléments et attributs en testant à la fois leur nom et leur espace de noms pour savoir comment les interpréter.

Conclusion

Bien que la recommandation sur les espaces de noms soit relativement simple, elle donne lieu à une série de malentendus qui ne devraient pas exister.

Les principaux points à retenir sont les suivants :

  • L'URI identifiant un espace de noms est un simple identificateur. Si l'on utilise une URL, les applications XML n'auront pas besoin d'accéder à cette adresse.
  • Les définitions de préfixes et d'espace de noms par défaut sont valables dans l'élément dans lequel elles sont présentes et dans tous ses descendants (jusqu'à ce qu'une nouvelle définition ne vienne éventuellement les modifier).
  • La valeur des préfixes n'a aucune importance pour les applications XML mais pour faciliter la lecture des documents XML par des lecteurs humains, il vaut mieux utiliser les préfixes usuels pour chacun des vocabulaires.
  • L'espace de noms par défaut ne s'applique pas aux attributs.

Références

Autres articles sur XMLfr :

Copyright 2005, Eric van der Vlist


 

Mots clés.



L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.


Les documents publiés sur ce site le sont sous licence "Open Content"
Conception graphique
  l.henriot  

Conception, réalisation et hébergement
Questions ou commentaires
  redacteurs@xmlfr.org