J'ai vu la ligne suivante dans un fichier XML :
xmlns:android="http://schemas.android.com/apk/res/android"
J'ai aussi 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 aussi vu xmlns
dans de nombreux autres fichiers XML que j'ai rencontrés.
Qu'est-ce que c'est ?
Cela signifie Espace de noms XML .
Fondamentalement, chaque élément (ou attribut) dans le fichier XML appartient à un espace de nom, une façon de "qualifier" le nom de l'élément.
Imaginez que vous et moi inventons tous deux notre propre XML. Vous inventez le XML pour décrire les personnes, 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 distinguer les deux noms ? Comme vous pouvez le voir ci-dessus, il y a deux name
mais ils ont tous deux des significations différentes.
La réponse est que vous et moi attribuerions tous deux un espace de nom à 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 entièrement qualifié notre XML, il n'y a plus d'ambiguïté quant à ce que chaque élément de l'XML doit faire. name
signifie. Toutes les balises qui commencent 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 toute déclaration d'espace de noms, les choses sont considérées comme étant dans l'espace de noms par défaut.
Si vous déclarez un espace de nom 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 nom proprement dit, souvent un IRI n'a aucune conséquence réelle. Il doit être unique, c'est pourquoi les gens ont tendance à choisir un IRI/URI qui leur appartient, mais cela n'a pas plus de signification que cela. Parfois, les gens placent le schéma (définition) du XML à l'IRI spécifié, mais il s'agit d'une convention réservée à certaines personnes.
Le préfixe n'a pas non plus d'importance. La seule chose qui compte, c'est l'espace de nom dans lequel le préfixe est défini. Plusieurs balises commençant par des préfixes différents, qui correspondent toutes au même espace de noms, sont considérées comme identiques.
Par exemple, si les préfixes personxml
y mycityxml
appartiennent tous les deux au même espace de noms (comme dans l'extrait ci-dessous), le fait de préfixer un élément donné avec le symbole personxml
o 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 nom auquel il correspond. Le préfixe est juste un indirection pointant vers l'espace de nom.
<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 ne sont pas non plus no héritent leur espace de nom de l'élément sur lequel ils se trouvent, par opposition aux éléments (voir ci-dessous).
En outre, les espaces de noms des éléments sont hérités de l'élément parent. En d'autres termes, j'aurais également pu écrire le XML ci-dessus sous la forme suivante
<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>
+1 bonne réponse conceptuelle utile. Vous voudrez peut-être nuancer "Fondamentalement, chaque élément (ou attribut) en xml appartient à un espace de nom", puisque certains éléments et attributs sont dits être dans "aucun espace de nom". Bien que je comprenne que vous donniez les bases.
@Rob Levine "Les attributs peuvent être namespaced mais ne le sont généralement pas." Qu'en est-il d'Android ?
Alors comment, par exemple, " votre.exemple.com/xml/personne " utilisé ? Ok, j'ai une balise <person:name>, et maintenant ? Pouvez-vous m'expliquer cela également ?
Il définit un Espace de nom XML .
Dans votre exemple, le Préfixe de l'espace de nommage est " Android " et le URI de l'espace de nommage 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 nom comme une variable avec un nom court alias pour l'URI complet de l'espace de nom. C'est l'équivalent d'écrire <http://schemas.android.com/apk/res/android:foo />
par rapport à ce qu'il "signifie" lorsqu'un analyseur XML lit le document.
NOTE : Vous ne pouvez pas utiliser l'URI complet de l'espace de nom à la place du préfixe de l'espace de nom dans un document d'instance XML.
Consultez ce tutoriel sur les espaces de noms : http://www.sitepoint.com/xml-namespaces-explained/
Je colle toujours ces URI dans un navigateur web juste pour voir ce que l'analyseur syntaxique regarde, mais il renvoie toujours 404. Est-ce que c'est censé être un véritable URI qui a besoin d'un nom de fichier standard ajouté à la fin, ou est-ce simplement une technique pour créer un identifiant unique ?
@Patrick oui, il s'agit simplement d'un URI qui doit être unique afin d'indiquer qu'il s'agit d'un espace de noms distinct des autres et que les éventuelles balises dupliquées seront donc interprétées correctement. Ainsi, l'URI ne mènera souvent à rien.
Hmm...bon de savoir que c'est un espace de nom. J'avais l'habitude de me demander si le fait de spécifier un URI faisait que la page html accédait réellement à ce site web pour déterminer un schéma.
Je pense que la plus grande confusion est que xml namespace pointe vers une sorte d'URL qui ne contient aucune information. Mais la vérité est que la personne qui a inventé le namespace ci-dessous :
xmlns:android="http://schemas.android.com/apk/res/android"
pourrait aussi l'appeler comme ça :
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
Il s'agit simplement d'un identifiant unique. Cependant, il est établi que vous devriez y mettre une URL qui est unique et qui peut potentiellement pointer vers la spécification des balises/attributs utilisés dans cet espace de nom. Ce n'est pas obligatoire.
Pourquoi doit-il être unique ? Parce que le but des espaces de noms est de les rendre uniques, de sorte que l'attribut appelé par exemple arrière-plan de votre espace de nom peuvent être distingués des arrière-plan d'un autre espace de nom.
En raison de cette unicité, vous ne devez pas craindre que si vous créez votre attribut personnalisé, vous ayez une collision de noms.
Xmlns - Espace de noms xml. C'est juste une méthode pour éviter les conflits de noms d'éléments. 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 différents node
dans un seul fichier xml. Sans espaces de noms, ce fichier ne serait pas valide.
Les espaces de noms permettent d'avoir des éléments uniques au niveau mondial. Cependant, dans 99% des cas, cela n'a pas vraiment d'importance, mais lorsque vous le mettez dans la perspective de Le Web sémantique il commence à devenir important.
Par exemple, vous pouvez réaliser un mash-up XML de différents schémas en utilisant simplement les options appropriées de l'option xmlns
. Par exemple, mélangez l'ami d'un ami avec vCard etc.
Pour du xml trivial, cela peut être ignoré, mais pour tout le reste, les 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 de la norme XML, vous mélangez la définition de l'interface et les détails de mise en œuvre.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Jetez un coup d'œil : programmateurs.stackexchange.com/questions/122002/
0 votes
Voir aussi Où est défini l'attribut xmlns ?
0 votes
Maintenant, vous devez également savoir pourquoi nous obtenons des erreurs dans le xml lorsque nous utilisons les balises de manière incorrecte ou au mauvais endroit :).