À quoi servent les espaces de noms XML?

C'est quelque chose que je trouve toujours un peu difficile à expliquer aux autres: Pourquoi existe-t-il des espaces de noms XML? Quand doit-on utiliser et quand ne doit-on pas? Quels sont les écueils courants lorsque vous travaillez avec des namespaces en XML?

de plus, Quel est leur lien avec les schémas XML? Les schémas XSD devraient-ils toujours être associés à un namespace?

64
demandé sur pnuts 2008-09-24 21:03:37

10 réponses

Ils sont pour plusieurs langages de balisage, sans avoir à se soucier des conflits de noms d'élément et attribut.

par exemple, regardez n'importe quel morceau de code XSLT, et puis pensez à ce qui se passerait si vous n'utilisiez pas d'espaces de noms et essayiez d'écrire un XSLT où la sortie doit contenir des éléments" template"," for-each", etc. Les erreurs de syntaxe, est ce que.

je vais laisser les conseils et les pièges à d'autres avec plus l'expérience de I.

32
répondu Steve Jessop 2008-09-24 17:08:26

pourquoi les espaces de noms XML existent-ils?

parce que, en 1997, des personnes très influentes du W3C les voulaient, et n'acceptaient pas un non comme réponse. Même lorsqu'il a été démontré, j'ose dire de façon concluante, qu'il y avait de meilleures façons de résoudre le "problème" qu'ils croyaient avoir, ils ont quand même exercé leur influence pour que leurs désirs soient inscrits dans une recommandation du W3C.

Le plus gros bobard en la mythologie extensive entourant les espaces de noms XML est qu'ils ont un mérite technique. (C'est l'effet en aval d'une recommandation simplement existante et donc occupant mindspace - "gee, il doit y avoir une (bonne) raison!"- par opposition à une note de bas de page oubliable quelque part.)

Beaucoup de douleur, aucun gain .

quand devrions-nous les utiliser et quand ne devrions-nous pas les utiliser?

vous ne devriez jamais utilisez-les si vous pouvez l'aider. Malheureusement, la promotion implacable de ce mauvais[*] dispositif par les parties intéressées a favorisé un clusterf*ck de spécifications aujourd'hui qui rendent pratiquement impossible de ne pas avoir à faire face à des espaces de noms XML à un moment ou un autre. Donc, même si vous évitez les namespaces XML vous-même, vous trouverez namespace-incrusted crud venant de toutes les directions, ou pire, des outils qui refusent tout simplement de fonctionner à moins que vous ne les alimentiez d'une telle crud.

Quels sont les pièges les plus courants lorsqu'on travaille avec des espaces de noms en XML?

un écueil très courant est d'utiliser des expressions Xpath avec des documents où un espace de noms a été" defouted": l'espace de noms devra être explicite dans les expressions. Un autre problème est de les utiliser "correctement" lors de la construction de documents: ils créent des problèmes à partir de l'air libre .

aussi, comment se rapportent-ils à XML les schémas? Les schémas XSD devraient-ils toujours être associés à un namespace?

il n'y a pas de relation nécessaire, sauf que le schéma XSD spec a été développé à un moment où à peu près tout le monde dans le Comité avait les espaces de noms XML bit dans leurs dents. Donc, ils ont aussi profondément qu'ils le pouvaient. Il est possible, néanmoins, d'utiliser des schémas XSD sans namespaces, mais c'est une montée abrupte slog comme à peu près chaque ensemble d'outils supportant des schémas XSD suppose que vous être "vouloir" utiliser des espaces de noms.

[*] MAUVAIS = mal Conçue

mise à JOUR: Une vieille essai sur cette non-solution à un non-problème .

18
répondu arayq2 2015-07-29 03:39:44

c'est presque la même chose que de demander" Pourquoi utilisons-nous des paquets pour Java/C#?":

  • réutilisabilité : vous pouvez réutiliser un ensemble de balises/attributs que vous définissez à travers différents types de documents xml.
  • modularité : si vous avez besoin d'ajouter un" aspect " à votre XML; ajouter un namespace à votre document xml est plus simple que de changer votre définition de schéma xml.
  • évitez de poluer l'espace de noms" principal : vous ne forcez pas votre analyseur à travailler avec une énorme définition de schéma, utilisez simplement l'espace de noms dont vous avez besoin.
17
répondu gizmo 2014-10-06 13:05:28

le plus grand écueil de L'IMHO est l'interaction humaine interprétant des documents, par exemple pour développer un code pour traiter un XML Doc. Il est trop facile de se concentrer sur l'expression littérale du document plutôt que de l'infoset résultat de l'analyse du document.

p.ex. les noeuds suivants

<a xmlns="uri:foo"/>
<foo:a xmlns:foo="uri:foo"/>
<bar:a xmlns:bar="uri:foo"/>

sont tous sémantiquement identiques - mais très différents à l'oeil naïf.

le premier exemple produit une erreur très courante XPaths-manque le fait que " a " est dans un espace de noms - donc //a ne donne pas de résultats. (ou pire encore, des noeuds assortis dans un espace de noms différent!)

le troisième exemple ouvre une autre faille dans la compréhension - que le texte du préfixe est sémantiquement significatif. Lors de l'analyse de documents avec XPATH je peux déclarer n'importe quel préfixe que j'aime pour la correspondance aussi longtemps que c'est uri correspond à ceux du document.

12
répondu stephbu 2008-09-24 17:27:02

pense à eux comme des noms de famille pour les types d'éléments. Si vous avez deux amis, tous deux appelés à Bob, et vous parler de l'un d'eux, quelqu'un pourrait demander à Bob qui vous parle. Juste dire "Bob" n'est pas très utile, donc vous dites "Bob Smith", ou "Bob Jones".

c'est la même chose avec les types d'éléments. Parfois, un nom court ne suffit pas, parce que différentes personnes peuvent choisir le même nom. Vous incluez donc une URI comme "nom de famille" , pour distinguer entre les différentes Bobs.

5
répondu Jim 2008-09-24 17:16:51

XML est un super-langage, ce qui signifie qu'il est la base de tout langage basé sur XML (c'est logique, non?). Pensez à XML comme un stylo qui peut écrire n'importe quelle phrase, dans n'importe quelle langue. Tout dépend de l'auteur, et de préférence la langue doit être connue du lecteur.

An XML namespace est essentiellement le nom de la langue, un peu comme" english "ou"Editions". J'aide le destinataire du document XML à analyser et extraire les informations dans.

disons que j'ai une usine de meubles et vous avez un magasin de meubles. votre application de stockage et mon application de fourniture sont complètement sans rapport, mais quand ils communiquent par des messages XML, les messages doivent être compréhensibles et facilement analysés par les deux côtés

par conséquent, les deux systèmes doivent connaître le schéma , qui définit la syntaxe de la langue et les restrictions convenues. Pensez au schéma comme le dictionnaire et Manuel de grammaire. Le schéma est le document que les deux systèmes doivent connaître, que quiconque écrit le code d'analyse dans chaque système doit savoir, et qui inclut la déclaration de l'espace de noms.

chaque namespace est nommé comme URI, qui dans la plupart des cas est l'emplacement du document de schéma qui le définit.

bien sûr, tous les documents XML n'ont pas besoin d'un espace de noms, surtout lorsqu'ils ne sont pas utilisés pour transmettre de l'information à un système distant. Par exemple, lorsque vous sérialisez des objets en XML pour les conserver dans votre base de données.

5
répondu Yuval 2008-09-24 17:18:20

nous utilisons des espaces de noms parce que les gens xeep veulent utiliser les mêmes mots pour signifier des choses différentes dans leur idaho privé. Habituellement, vous pouvez déterminer à partir du contexte ce qu'une personne signifie. Dans une base de données de personnel, le XML est des dossiers de personnel. Dans une base de données d'immatriculation de véhicules, le XML est des enregistrements d'immatriculation de véhicules.

conservent tous les deux une étiquette nommée "location", mais l'étiquette signifie des choses différentes pour chacun et contient des champs différents.

maintenant, c'est cool: mais que faire si vous avez besoin ou que vous voulez stocker XML à partir des deux dans la même base de données? Ou, ce qui est plus intéressant, ce que si les deux bases de données veulent stocker des morceaux XML d'un autre, base de données commune (par exemple: une base de données de comptes).

les espaces de noms XML sont associés à chaque URI de balise XML, de sorte que le nom de balise lui-même a une url en face de lui, qui fait partie du nom de balise (bien sûr, les documents XML réels utilisent un raccourci faire ceci). En choisissant soigneusement L'URI, il est facile d'être sûr que les noms des balises ne vont pas entrer en collision - c'est comme si les deux balises de localisation avaient été nommées de façon totalement différente, donc il n'y a pas de confusion. En prime, les deux étiquettes de localisation entièrement différentes peuvent inclure des éléments de la base de données des comptes, et déclarer explicitement qu'elles parlent de la même chose.

la chose qui rend tout cela utile est XPATH.

avec ce qui précède, vous pouvez commencer à écrire des expressions XPATH qui disent des choses comme: find moi tout accounts:account overdue sections n'importe où dans le document xml. Ou: trouvez-moi n'importe quel article accounts:warning message n'importe où dans ce morceau particulier de XML, où le message d'avertissement est un noeud enfant (aussi profond soit-il) d'un noeud personnel:payment ou d'un noeud vehicle:status .

que L'expression XPATH pourrait être utilisée quelque part dans un document XSLT, dont le travail est de convertir le XML en XHTML ou XPDF, pour affichage.

Quel est le résultat? Pourquoi le faire? Parce que vous pouvez rechercher le XML logfile, retirez tous les comptes messages en retard partout où ils apparaissent, sans les confondre avec" message "étiquettes produites par d'autres systèmes , convertir 'em en xhtml, et les afficher en gras rouge via une étiquette css: tout sans écrire un morceau de code de procédure .

3
répondu paulmurray 2009-03-22 02:16:52

par exemple: Namespaces XML par exemple

dans mes mots: Si vous devez utiliser un format XML pour société externe ( par exemple ) et vous devez fournir dans le document XML quelques informations, qui a le même nom, vous avez besoin d'un namespace. Exemple:

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="Blue"/>
      </items>
   </header>
</sampleDoc>

et vous voulez fusionner certaines données dans ce document, qui a un même nom, mais un autre sens (donc valeur à ), vous devriez utiliser un espace de nom:

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="White" my_unique_namespace:color="#FFFFFF"/>
      </items>
   </header>
</sampleDoc>

bien sûr - vous pouvez modifier un nom d'attribut. Par exemple à"my_unique_color". Bud dans un autre document, il peut y avoir attribut avec le même nom à nouveau. Ainsi, si vous avez un namespace unique (notre domaine web par exemple ), vous pouvez toujours utiliser les mêmes noms d'éléments et/ou d'attributs sans aucun problème.

1
répondu TcKs 2008-09-24 17:15:20

De la W3 recommandation ...

Les espaces de noms XML

fournissent une méthode simple pour qualifier les noms d'éléments et d'attributs utilisés dans les documents en langage de balisage Extensible en les associant à des espaces de noms identifiés par des références URI.

0
répondu Joe Skora 2008-09-24 17:07:56
Les Namespaces

sont utilisés pour désambiguer les noms que vous utilisez dans le document. Il vous donne également la possibilité de lier un nom court à un espace de nom qui peut ensuite être utilisé pour se référer à un élément ou un attribut distant. L'Espace nom lui-même fait référence à l'emplacement qui définit les éléments et les attributs que vous utilisez dans le document. Il y a beaucoup plus à savoir, mais c'est le cœur de celui-ci. Il ya beaucoup plus d'informations ici .

0
répondu AdamC 2008-09-24 17:11:02