web-dev-qa-db-fra.com

Que signifie "xmlns" en XML?

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

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

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

Qu'Est-ce que c'est?

393
user88637

Il définit un XML Namespace .

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

Dans le document, vous voyez des éléments tels que: <Android:foo />

Considérez le préfixe d'espace de nom comme une variable avec un alias de nom court pour l'URI d'espace de nom complet. 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 utiliser l'URI d'espace de nom complet à la place de le préfixe de l'espace de noms dans un document d'instance XML.

Découvrez ce tutoriel sur les espaces de noms: http://www.sitepoint.com/xml-namespaces-explained/

286
Mads Hansen

Cela signifie espace de noms XML .

Fondamentalement, chaque élément (ou attribut) de XML appartient à un espace de noms, ce qui permet 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 des personnes, j'invente le mien pour décrire des 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, il 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 fichiers XML étaient combinés en un seul document, comment distinguerions-nous les deux noms? Comme vous pouvez le voir ci-dessus, il existe deux éléments name, mais ils ont tous deux une signification différente.

La réponse est que vous et moi allions attribuer un espace de nom à notre code XML, ce 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 code XML, il n’ya aucune ambiguïté quant à la signification de chaque élément name. Toutes les balises commençant par personxml: sont des balises appartenant à votre code XML, toutes celles commençant 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 appartenant à l'espace de noms par défaut.

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

  • L'espace de noms lui-même, souvent un IRI , n'a aucune conséquence réelle. Il devrait être unique, de sorte que les gens ont tendance à choisir un IRI/URI qu'ils possèdent, mais cela n'a pas de plus grande signification que cela. Parfois, les personnes placent le schéma (définition) du fichier XML à l'adresse IRI spécifiée, mais il s'agit d'une convention réservée à certaines personnes.

  • Le préfixe est sans conséquence non plus. La seule chose qui compte est l'espace de noms défini par le préfixe. Plusieurs balises commençant par des préfixes différents, qui correspondent toutes au même espace de nom, sont considérées comme identiques.

    Par exemple, si les préfixes personxml et mycityxml sont tous deux mappés vers le même espace de nom (comme dans l'extrait ci-dessous), cela n'a pas d'importance si vous préfixez un élément donné avec personxml ou mycityxml, ils seraient 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, mais uniquement de l'espace de noms qu'il mappe également. Le préfixe est juste un 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 de leur espace de noms de l'élément sur lequel ils se trouvent, par opposition 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 également pu é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>
648
Rob Levine

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 indiquer une URL unique et potentiellement pointer vers la spécification des balises/attributs utilisés dans cet espace de noms. Ce n'est pas nécessaire tho.

Pourquoi ça devrait être unique? Parce que les espaces de noms ont pour but de les rendre uniques, l'attribut par exemple appelé background de votre espace de noms peut être distingué de background d'un autre espace de noms.

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

13
Morfidon

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 éléments node différents dans un fichier XML. Sans espaces de noms, ce fichier ne serait pas valide.

11
Yura

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 présentez dans la perspective de Le Web sémantique , cela commence à devenir important.

Par exemple, vous pouvez créer un mash-up XML de différents modèles en utilisant simplement le xmlns approprié. Par exemple, écrasez l'ami d'un ami avec vCard , etc.

4
Jon

XML Namespaces fournit une méthode pour éviter les conflits de noms d'élément. En XML, les noms d'éléments sont définis par le développeur. Cela entraîne souvent un conflit lorsque vous essayez de mélanger des documents XML à partir de différentes applications XML.

Les conflits de noms en XML peuvent facilement être évités en utilisant un préfixe de nom. Lorsque vous utilisez des préfixes en XML, un espace de noms pour le préfixe doit être défini.

L'espace de nom peut être défini par un attribut xmlns dans la balise de début d'un élément. La déclaration d'espace de nom a la syntaxe suivante. xmlns: prefix = "URI".

0
Neeraj Gahlawat