Programmation XML/Espace de nom
Les espaces de noms (ou namespace) sont destinés à lever les ambiguïtés éventuelles des intitulés de balise, au moyen d'un identifiant de ressource unique (URI).
Chaque espace de nom est défini par un couple URI et préfixe. L'URI défini l'espace de nom de manière unique. Tandis que le préfixe est utilisé devant les éléments et attributs référençant l'espace de nom. Le préfixe peut varier d'un document à un autre ou d'une déclaration d'espace de nom à l'autre dans le même document XML.
Déclaration d'un espace de nom
[modifier | modifier le wikicode]L'exemple ci-dessous contient deux déclarations, la première par défaut et la seconde associant le préfixe « ip » à l'URI des adresses IP, pour les distinguer des adresses postales :
<adresse
xmlns="http://www.example.com/adresses_postales"
xmlns:ip="http://www.example.com/adresses_ip">
La déclaration se fait avec un attribut nommé "xmlns" suivi d'un caractère deux-points (:) et du préfixe associé à l'espace de nom.
La valeur de l'attribut est l'URI associée à l'espace de nom.
L'URI peut être une URL (Uniform Resource Locator, exemple : https://fr.wikibooks.org) ou un URN (Uniform Resource Name, exemple : urn:wikibooks:fr:exemple).
Exemple :
<ip:adresse xmlns:ip="urn:network:ip" ip:type="unicast">127.0.0.1</ip:adresse>
Les préfixes commençant par "xml" (quel que soit la casse : XML, xML...) sont réservés, comme xmlns pour la déclaration d'espaces de nom.
Les préfixes sont généralement fixés à l'avance pour chaque espace de nom afin d'avoir une cohérence entre document et avoir un préfixe reflétant l'espace de nom correspondant. Il est cependant nécessaire d'utiliser un autre préfixe pour éviter un conflit avec un autre espace de nom.
Certains préfixes communément utilisés sont listés ici :
xsdouxspour XML Schema ;xmlpour certains éléments et attributs généraux commexml:lang, ...- ...
Espace de nom par défaut
[modifier | modifier le wikicode]L'espace de nom par défaut est déclaré sans préfixe. Les éléments et attributs utilisant cet espace de nom n'ont donc pas de préfixe non plus.
Exemple :
<adresse xmlns="urn:network:ip" type="unicast">127.0.0.1</adresse>
Quand plusieurs espaces de nom sont utilisés, un seul espace de nom peut être défini comme celui par défaut pour un même élément.
Exemple :
<group xmlns="urn:wikibooks:example" xmlns:res="urn:commons:example">
<serveur xmlns="urn:network:ip">
<nom>serveur.example.wikibooks.org</nom>
<adresse type="unicast">127.0.0.1</adresse>
</serveur>
<contact xmlns="urn:message:courrier">
<nom>Service courrier de wikibooks</nom>
<adresse>123 rue de Quatre-Cinq, 67890 EXEMPLE</adresse>
</contact>
</group>
Portée d'un espace de nom
[modifier | modifier le wikicode]Un espace de nom est valide depuis l'ouverture de l'élément contenant la déclaration jusqu'à la fermeture de cet élément.
Exemple :
<ip:serveur xmlns:ip="urn:network:ip">
<ip:nom>serveur.example.wikibooks.org</ip:nom>
<ip:adresse type="unicast">127.0.0.1</ip:adresse>
<postal:contact xmlns:postal="urn:message:courrier">
<postal:nom>Service courrier de wikibooks</postal:nom>
<postal:adresse>123 rue de Quatre-Cinq, 67890 EXEMPLE</postal:adresse>
</postal:contact>
</ip:serveur>
Cette portée peut être suspendue dans un élément enfant déclarant un autre espace de nom avec le même préfixe.
Exemple :
<ip:serveur xmlns:ip="urn:network:ip">
<ip:nom>serveur.example.wikibooks.org</ip:nom>
<ip:adresse type="unicast">127.0.0.1</ip:adresse>
<ip:contact xmlns:ip="urn:message:courrier">
<ip:nom>Service courrier de wikibooks</ip:nom>
<ip:adresse>123 rue de Quatre-Cinq, 67890 EXEMPLE</ip:adresse>
</ip:contact>
</ip:serveur>
L'exemple précédent montre qu'il vaut mieux éviter de réutiliser le même préfixe pour éviter les confusions et ambiguïtés. Cependant cela peut être produit par des outils de fusion de documents XML.
Dissocier un espace de nom
[modifier | modifier le wikicode]Tout comme un élément peut redéfinir un espace de nom avec le même préfixe ou l'espace de nom par défaut, il peut également dissocier un espace de nom en utilisant une URI vide. Cela n'est autorisé qu'à partir de la version 1.1 de XML.
Exemple :
<ip:serveur xmlns:ip="urn:network:ip">
<ip:nom>serveur.example.wikibooks.org</ip:nom>
<ip:adresse type="unicast">127.0.0.1</ip:adresse>
<contact xmlns:ip="">
<nom>Service courrier de wikibooks</nom>
<adresse>123 rue de Quatre-Cinq, 67890 EXEMPLE</adresse>
</contact>
</ip:serveur>

