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?
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?
Réponses:
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/
<LinearLayout
œuvres sans préfixe?
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 personxml
et les mycityxml
deux 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 personxml
ou 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>
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.
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.
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.