3.Les namespaces (ou espaces de noms)

3.1.Pourquoi un namespace ?

Nous avons vu jusque là qu'un fichier XML est un simple fichier texte avec des balises (qui doivent construire un document dit "bien formé[c'est quoi un document bien formé?]"). Et nous savons que pour pouvoir être exploités, ces fichiers XML doivent suivre une structure donnée (ils doivent être "valides").
Dans un cas simple, un document XML ne contiendra des balises n'appartenant qu'à une seule norme. Et pourtant, dans le vie de tous les jours, il peut arriver qu'un document XML répondant à une norme donnée embarque en son sein des balises issues d'une autre norme.
Ce peut être le cas par exemple d'un document XHTML intégrant du code SVG.
<?xml version="1.0">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head><title>Exemple de fichier XHTML avec SVG</head>
  <body>
     <svg version="1.1" width="200" height="200">
       <title>Exemple SVG</title>
       <circle cx="100" cy="100" r="70" fill="red" />
     </svg>
  </body>
</html>
Dans ce cas, si l'on traite le document comme un pur document XHTML on va vite constater que la balise svg n'est pas une balise XHTML valide (pas plus que circle). Et si la balise title que l'on retrouve dans svg est bien une balise XHTML, ce n'est pas là qu'on l'attend (et pour cause, celle qui est ici n'a pas la même signification que celle au sein de head).
Que faire alors? Réponse: Introduire la notion d'espace de noms.

3.2.C'est quoi un namespace ?

Pour contrer ce genre de problème, il faut donc préciser au sein du document XML à quel "domaine" s'applique la balise. Est-ce une balise XHTML ou bien une balise SVG? Si ce n'est que, plutôt que de parler de domaine on parlera d'espace de noms ou en anglais namespace.
Dans notre exemple, les balises svg, circle et le title qui est sous svg appartiennent à l'espace de noms SVG. Les autres balises à l'espace de noms XHTML.

3.3.Comment déclarer un namespace ?

Pour déclarer un namespace il faut faire appel à l'attribut XML xmlns (ns pour namespace).
On affectera à cet attribut une URI qui est propre à l'espace de noms. Ainsi pour SVG on pointera sur "http://www.w3.org/2000/svg".
Ainsi pour déclarer que la balise svg et tout ce qu'elle contient est associé à l'espace de noms SVG (et non pas XHTML) il suffit de modifier l'exemple précédent comme suit:
<?xml version="1.0">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head><title>Exemple de fichier XHTML avec SVG</head>
  <body>
     <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="200">
       <title>Exemple SVG</title>
       <circle cx="100" cy="100" r="70" fill="red" />
     </svg>
  </body>
</html>