xml
Espaces de noms
Recherche…
Remarques
Les noms d'éléments et d'attributs en XML sont appelés QNames (noms qualifiés).
Un QName est composé de:
- un espace de noms (un URI)
- un préfixe (un NCName, NC car il ne contient pas de deux-points)
- un nom local (un NCName)
Seuls l'espace de noms et le nom local sont pertinents pour comparer deux noms QNames. Le préfixe est uniquement un proxy pour l'espace de noms.
L'espace de nom et le préfixe sont facultatifs, mais l'espace de nom est toujours présent si le préfixe est présent (ceci est garanti au niveau syntaxique, donc cela ne peut pas être mal fait).
La représentation lexicale d'un QName est un prefix:local-name
. L'espace de nom est lié séparément en utilisant les attributs spéciaux xmlns:...
(rappel: les attributs commençant par xml sont réservés en XML).
Si le préfixe est vide, aucun deux-points n'est utilisé dans la représentation lexicale du QName, qui contient uniquement le local-name
. Les QNames avec un préfixe vide n'ont aucun espace de noms (si aucun espace de noms par défaut n'est dans la portée) ou sont dans l'espace de noms par défaut.
Lier un préfixe à un espace de noms
Un espace de noms est un URI, mais pour éviter toute verbosité, les préfixes sont utilisés comme proxy.
Dans l'exemple suivant, le préfixe my-prefix
est lié à l'espace de noms http://www.example.com/my-namespace
en utilisant l'attribut spécial xmlns:my-prefix
( my-prefix
peut être remplacé par tout autre préfixe) :
<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
<!-- the element my-prefix:foo
lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>
Absence d'espace de nommage
En XML, les noms d'éléments et d'attributs vivent dans les espaces de noms.
Par défaut, ils ne sont dans aucun espace de noms:
<?xml version="1.0"?>
<foo attr="value">
<!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>
Non pertinence des préfixes
Ces deux documents sont sémantiquement équivalents, car les espaces de noms importent, pas les préfixes.
<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>
<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>
Espace de noms par défaut
L'espace de noms par défaut est l'espace de noms correspondant à l'absence de préfixe. Il peut être déclaré avec l'attribut spécial xmlns
.
<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
<!-- the element foo is in the namespace
http://www.example.com/my-namespace -->
</foo>
Si aucun espace de noms par défaut n'est déclaré, les noms sans préfixe ne sont dans aucun espace de noms.
Noms d'attribut sans préfixe
Les éléments et les attributs se comportent différemment par rapport aux espaces de noms par défaut. C'est souvent la source de confusion.
Un attribut dont le nom n'a pas de préfixe ne réside dans aucun espace de noms, même lorsqu'un espace de noms par défaut est dans la portée .
<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
<!-- The attribute attr is in no namespace, even though
a default namespace is in scope. The element foo,
however, is in the default namespace. -->
</foo>
Portée des liaisons d'espace de noms
Une liaison d'espace de noms (attribut spécial xmlns
ou xmlns:...
) est envisageable pour tous les descendants de l'élément englobant, y compris cet élément.
<?xml version="1.0"?>
<root>
<my:element xmlns:my="http://www.example.com/ns1">
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
</my:element>
<my:element xmlns:my="http://www.example.com/ns2">
<!-- here, the prefix my is bound to http://www.example.com/ns2 -->
</my:element>
</root>
La liaison peut être remplacée dans un élément imbriqué (cela affecte cependant la lisibilité):
<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
<my:first-child-element/>
<my:child-element xmlns:my="http://www.example.com/ns2">
<!-- here, the prefix my is bound to http://www.example.com/ns2,
including for the element my:child-element -->
</my:child-element>
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
<my:last-child-element/>
</my:element>
Il est très courant de déclarer toutes les liaisons d'espace de noms dans l'élément racine, ce qui améliore la lisibilité.
<?xml version="1.0"?>
<root
xmlns="http://www.example.com/default-namespace"
xmlns:ns1="http://www.example.com/ns1"
xmlns:ns2="http://www.example.com/ns2">
<ns1:element>
<ns2:other-element/>
</ns1:element>
</root>