Que signifie «xmlns» en XML?

415

J'ai vu la ligne suivante dans un fichier XML:

xmlns:android="http://schemas.android.com/apk/res/android"

J'ai également vu xmlnsdans de nombreux autres fichiers XML que j'ai rencontrés.

Qu'Est-ce que c'est?

user88637
la source
Maintenant, vous auriez également dû savoir pourquoi nous obtenons des erreurs dans le xml lorsque nous utilisons les balises de manière incorrecte ou au mauvais endroit. :)
Vaibs

Réponses:

299

Il définit un espace de noms XML .

Dans votre exemple, le préfixe d'espace de noms est « android » et l' URI d'espace de noms est « http://schemas.android.com/apk/res/android »

Dans le document, vous voyez des éléments comme: <android:foo />

Considérez le préfixe d'espace de noms comme une variable avec un alias de nom court pour l'URI complet de l'espace de noms. C'est l'équivalent d'écrire <http://schemas.android.com/apk/res/android:foo />en ce qui concerne ce que cela signifie quand un analyseur XML lit le document.

REMARQUE: vous ne pouvez pas réellement utiliser l'URI d'espace de noms complet à la place du préfixe d'espace de noms dans un document d'instance XML.

Consultez ce didacticiel sur les espaces de noms: http://www.sitepoint.com/xml-namespaces-explained/

Mads Hansen
la source
62
Je colle toujours ces URI dans un navigateur Web juste pour voir ce que l'analyseur regarde, mais il renvoie toujours 404. Est-il censé être un vrai URI qui a besoin d'un nom de fichier standard à la fin, ou est-ce juste une technique pour avoir fait un identifiant unique?
Patrick
36
@Patrick oui, c'est juste un URI qui doit être unique afin d'indiquer qu'il s'agit d'un espace de noms distinct des autres et toute balise potentielle en double sera donc interprétée correctement. Ainsi, l'URI ne pointe souvent vers rien.
foochow
3
Hmm ... bon de savoir que c'est un espace de noms. Je me demandais si la spécification d'un URI permettait à la page html d'accéder réellement à ce site Web pour déterminer un schéma.
Nav
17
@Patrick, l'URI n'est pas la même chose que l'URL. Une URL est un localisateur et un URI n'est qu'un identifiant. Vous pouvez très bien choisir un GUID comme URI. En fait, l'ISBN que nous avons pour les livres est une forme d'URI.
Jaywalker
alors comment fonctionnent les tags? Je veux dire des <LinearLayoutœuvres sans préfixe?
Asif Mushtaq
676

Cela signifie un espace de noms XML .

Fondamentalement, chaque élément (ou attribut) en XML appartient à un espace de noms, une façon de "qualifier" le nom de l'élément.

Imaginez que vous et moi inventions tous les deux notre propre XML. Vous inventez XML pour décrire les gens, j'invente le mien pour décrire les villes. Nous incluons tous les deux un élément appelé name. Le vôtre fait référence au nom de la personne et le mien au nom de la ville - OK, c'est un peu artificiel.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Si nos deux XML étaient combinés en un seul document, comment distinguerions-nous les deux noms? Comme vous pouvez le voir ci-dessus, il existe deux nameéléments, mais ils ont tous deux des significations différentes.

La réponse est que vous et moi attribuerions tous deux un espace de noms à notre XML, que nous rendrions unique:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

Maintenant que nous avons pleinement qualifié notre XML, il n'y a aucune ambiguïté quant à la signification de chaque nameélément. Toutes les balises commençant par personxml:sont des balises appartenant à votre XML, toutes celles qui commencent par cityxml:sont les miennes.

Il y a quelques points à noter:

  • Si vous excluez des déclarations d'espace de noms, les éléments sont considérés comme se trouvant dans l'espace de noms par défaut.

  • Si vous déclarez un espace de noms sans l'identifiant, c'est-à-dire xmlns="http://somenamespace", plutôt que xmlns:rob="somenamespace", il spécifie l'espace de noms par défaut pour le document.

  • L'espace de noms lui-même, souvent un IRI , n'a aucune conséquence réelle. Il devrait être unique, donc les gens ont tendance à choisir un IRI / URI qui leur appartient, mais cela n'a pas plus de sens que cela. Parfois, les gens placent le schéma (définition) du XML à l'IRI spécifié, mais c'est une convention de certaines personnes seulement.

  • Le préfixe n'a pas de conséquence non plus. La seule chose qui compte est l'espace de nommage auquel le préfixe est défini. Plusieurs balises commençant par des préfixes différents, qui mappent tous vers le même espace de noms sont considérées comme identiques.

    Par exemple, si les préfixes personxmlet les mycityxmldeux sont mappés sur le même espace de noms (comme dans l'extrait ci-dessous), cela n'aurait pas d'importance si vous préfixez un élément donné avec personxmlou mycityxml, ils seront tous deux traités comme la même chose par un analyseur XML . Le fait est qu'un analyseur XML ne se soucie pas de ce que vous avez choisi comme préfixe, seulement de l'espace de noms qu'il mappe également. Le préfixe est juste une indirection pointant vers l'espace de noms.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Les attributs peuvent être qualifiés mais ne le sont généralement pas. Ils n'héritent pas non plus de leur espace de noms de l'élément sur lequel ils se trouvent, contrairement aux éléments (voir ci-dessous).

De plus, les espaces de noms d'élément sont hérités de l'élément parent. En d'autres termes, j'aurais pu également écrire le XML ci-dessus comme

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>
Rob Levine
la source
13
+1 bonne réponse conceptuelle utile. Vous voudrez peut-être qualifier "Fondamentalement, chaque élément (ou attribut) en xml appartient à un espace de noms", car certains éléments et attributs sont censés être "sans espace de noms". Même si je comprends que vous donniez les bases.
LarsH
1
@Rob Levine "Les attributs peuvent être des espaces de noms mais ne le sont généralement pas." Et Android?
Paul Brewczynski
1
Alors, comment est utilisé par exemple " your.example.com/xml/person "? Ok j'ai une balise <person: name>, maintenant quoi? Pouvez-vous expliquer cela également s'il vous plaît?
Koray Tugay
1
@WORMSS - Oui - vous avez raison. Lorsque vous définissez votre requête, vous devez spécifier l'espace de noms, probablement via un préfixe. Dans le monde C # System.Xml, par exemple, vous enregistrez un préfixe auprès du gestionnaire d'espace de noms à l'aide de XmlNamespaceManager.AddNamespace, puis utilisez ce préfixe dans votre requête. Le fait que le préfixe n'apparaisse pas dans le document n'a pas d'importance - seulement l'espace de noms qu'il mappe également.
Rob Levine
2
Ce lien vers le document Microsoft: " msdn.microsoft.com/en-us/library/aa468565.aspx " explique très bien l'espace de noms en XML.
Deen John
16

Je pense que la plus grande confusion est que l'espace de noms xml pointe vers une sorte d'URL qui ne contient aucune information. Mais la vérité est que la personne qui a inventé l'espace de noms ci-dessous:

xmlns:android="http://schemas.android.com/apk/res/android"

pourrait aussi l'appeler comme ça:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

Ceci est juste un identifiant unique. Cependant, il est établi que vous devez y mettre une URL unique qui peut potentiellement pointer vers la spécification des balises / attributs utilisés dans cet espace de noms. Ce n'est pas obligatoire.

Pourquoi devrait-il être unique? Parce que le but des espaces de noms est de les rendre uniques afin que l'attribut par exemple appelé arrière-plan de votre espace de noms puisse être distingué de l' arrière - plan d'un autre espace de noms.

En raison de cette unicité, vous n'avez pas à vous soucier du fait que si vous créez votre attribut personnalisé, vous aurez une collision de noms.

Morfidon
la source
Salut Morfidon. S'il vous plaît, pourriez-vous ajouter dans votre réponse un lien vers une référence spécifiant que le contenu ou l'URL peut être n'importe quoi? Qu'est-ce qui doit être unique? Veuillez également préciser l'unicité: le nom de l'espace de noms XML ou le contenu de l'URL? Vive
olibre
@olibre Si vous souhaitez utiliser l'espace de noms d'Android, vous devez utiliser son nom. C'est leur nom unique. Ils ont décidé d'y mettre une URL. Si vous créez votre propre espace de noms, vous pouvez l'appeler comme vous voulez, assurez-vous qu'il est unique. Il est dit que vous devez utiliser une URL qui pointe vers l'endroit où vous décrivez ce qui se trouve à l'intérieur de cet espace de noms, mais comme vous pouvez le voir, même les créateurs d'espace de noms Android ne l'ont pas fait.
Morfidon
Merci Morfidon. J'ai finalement compris ce point en lisant la réponse de Rob . J'aime votre réponse car elle met en évidence un aspect important qui n'est pas bien connu. Mais essayez d'améliorer votre réponse, clarifiez quelle partie doit être unique, fournissez des références, reformulez, vérifiez la formulation ... Certains lecteurs peuvent être confus par votre réponse actuelle. Cheers
olibre
1
C'est la réponse dont j'avais besoin! Il est donc déroutant d'utiliser un URI pour cette valeur d'attribut, car les gens pensent que URI = URL et s'attendent à ce que certains documents résident à l'emplacement. Mais AFAICT, c'est tout à fait correct si l'URI renvoie un 404. C'est juste un identifiant unique qui ressemble à une adresse. Il pourrait y avoir des validateurs spéciaux qui s'attendent à trouver un schéma ou une DTD à cet endroit (ce qui aurait du sens), mais ce sont des cas spéciaux, je pense. Veuillez me corriger si je me trompe ici.
brennanyoung
1
@brennanyoung c'est exactement comme vous l'avez dit :)
Morfidon
12

xmlns - espace de noms xml. C'est juste une méthode pour éviter les conflits de nom d'élément. Par exemple:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

Deux nodeéléments différents dans un fichier xml. Sans espaces de noms, ce fichier ne serait pas valide.

Yuriy
la source
4

Vous avez des espaces de noms afin que vous puissiez avoir des éléments uniques au monde. Cependant, 99% du temps, cela n'a pas vraiment d'importance, mais lorsque vous le mettez dans la perspective du Web sémantique , cela commence à devenir important.

Par exemple, vous pouvez créer un mash-up XML de différents schémas simplement en utilisant la méthode appropriée xmlns. Par exemple, écrasez l'ami d'un ami avec vCard , etc.

Jon
la source
pour le xml trivial, il pourrait être ignoré, car tout le reste des espaces de noms sont extrêmement importants. + Je ne vois vraiment pas le lien entre le web sémantique et l'espace de noms. Le web sémantique est un concept, l'espace de noms fait partie du standard XML, vous mélangez la définition de l'interface et les détails d'implémentation.
Newtopian