web-dev-qa-db-fra.com

Quels sont les espaces de noms XML?

C'est quelque chose que je trouve toujours un peu difficile à expliquer aux autres: pourquoi les espaces de noms XML existent-ils? Quand devrions-nous les utiliser et quand devrions-nous pas? Quels sont les pièges communs lorsque vous travaillez avec des espaces de noms dans XML?

En outre, comment se rapportent-ils aux schémas XML? Les schémas XSD doivent-ils toujours être associés à un espace de noms?

68
Doron Yaacoby

Ils permettent de permettre de combiner plusieurs langues de balisage, sans avoir à se soucier des conflits d'élément et de noms d'attributs.

Par exemple, examinez tout le code XSLT, puis pensez ce qui se passerait si vous n'avez pas utilisé les espaces de noms et essayiez d'écrire un XSLT où la sortie doit contenir "modèle", "pour chacun", etc., éléments . Erreurs de syntaxe, c'est quoi.

Je laisserai les conseils et les pièges aux autres avec plus d'expérience que moi.

33
Steve Jessop

Pourquoi les espaces de noms XML existent-ils ?

Parce que, en 1997, des personnes très influentes du W3C les voulaient et ne prendraient pas de réponse pour une réponse. Même lorsqu'il a été démontré, j'ose dire de manière concluante, qu'il y avait de meilleurs moyens de résoudre le "problème" qu'ils pensaient avoir eu leur influence, ils ont toujours soumis leur influence pour que leurs désirs ont rédigé une recommandation W3C.

La plus grosse grossière de la mythologie intitulée Menthologie entourant des espaces de noms XML est qu'il y a un mérite technique. (C'est l'effet aval d'une recommandation simplement existant et d'occuper ainsi l'esprit de l'esprit - "Gee, il doit être une (bonne) raison!" - par opposition à une note de bas de page oubliable quelque part.)

beaucoup de douleur, pas de gain .

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

Vous ne devriez jamais les utiliser si vous pouvez l'aider. Malheureusement, la promotion implacable de ce mauvais périphérique [*] par les parties intéressées a favorisé une clusterf * ck de spécifications aujourd'hui qui rendent pratiquement impossible de ne pas avoir à faire face aux espaces de noms XML à un moment ou à un autre. Donc, même si vous eschetez vous-même des espaces de noms XML vous-même, vous trouverez le crud incrusté de l'espace de noms qui vous appartient de toutes les directions, ou pire, des outils d'outils qui refusent simplement de travailler à moins que vous ne les nourrissez de ce type.

Quels sont les pièges courants lorsque vous travaillez avec des espaces de noms dans XML ?

Un piège très courant consiste à utiliser des expressions XPath avec des documents dans lesquels un espace de noms a été "handicapé": l'espace de noms devra être explicite dans les expressions. Un autre problème les utilise "correctement" lors de la construction de documents: ils créent des problèmes d'air mince .

Aussi, comment se rapportent-ils aux schémas XML? Les schémas XSD doivent-ils toujours être associés à un espace de noms ?

Il n'existe aucune relation nécessaire, sauf que la spécification du schéma XSD a été développée à une époque où à peu près tout le monde sur le comité disposait des espaces de noms XML dans leurs dents. Donc, ils l'ont travaillé aussi profondément que possible. Il est néanmoins possible d'utiliser des schémas XSD sans espaces de noms, mais c'est un slog escarpé de montée comme à peu près tous les outils de support XSD supposant que vous allez utiliser des espaces de noms.

[*] Mauvais = cassé comme conçu

Mise à jour: n ancien essai sur cette non-solution à un non-problème .

20
arayq2

Il est presque le même que de demander "pourquoi utilisons-nous des packages pour Java/C #?":

  • Réutilisabilité: Vous pouvez réutiliser un ensemble de balises/attributs que vous définissez sur différents types de documents XML.
  • modularité: Si vous devez ajouter un "aspect" à votre XML; L'ajout d'un espace de noms à votre document XML est plus simple que de modifier toute votre définition de schéma XML.
  • Évitez de poluter 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
gizmo

Le plus gros piège IMHO est l'interprétation des interactions humaines. Développer du code pour traiter un document XML. Il est trop facile de se concentrer sur l'expression littérale du document plutôt que sur le résultat infosé de l'analyse du document.

par exemple. les nœuds 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 pour l'œil naïf.

Le 1er exemple donne une erreur très fréquente développant des xpaths - manquait le fait que "A" est dans un espace de noms - Ainsi // A donne non des matchs. (ou pire encore des nœuds correspondant dans un espace de noms différent!)

Le 3ème exemple ouvre une autre faille dans la compréhension - que le texte de préfixe est sémantiquement significatif. Lors de l'analyse de documents avec XPath, je peux déclarer tout préfixe que j'aime pour la correspondance tant que c'est URI correspond à ceux du document.

12
stephbu

Pensez à eux comme des noms de famille pour les types d'éléments. Si vous avez deux amis, les deux appelés Bob, et vous parlez de l'un d'entre eux, quelqu'un pourrait demander quel Bob vous parlez. Dire juste "Bob" n'est pas très utile, alors vous dites "Bob Smith" ou "Bob Jones".

C'est la même chose avec les types d'éléments. Parfois, un nom court n'est pas suffisant, car différentes personnes peuvent choisir le même nom. Donc, vous incluez une URI en tant que "nom de famille", pour distinguer les différents bobs là-bas.

6
Jim

XML est un super-langage, ce qui signifie qu'elle est la base de toute langue XML (logique, non?). Pensez à XML comme un stylo qui peut écrire une phrase, dans toutes les langues. Tout dépend de l'écrivain, et de préférence la langue doit être connue du lecteur.

Un XML namespace est essentiellement le nom de la langue, un peu comme " anglais " ou " עברית ". J'aide le destinataire du document XML pour analyser et en extraire les informations contenues dans.

Disons que j'ai une fabrique de meubles et vous avez un magasin de meubles. votre demande de stockage et ma demande d'approvisionnement sont sans aucun rapport, mais quand ils communiquent par des messages XML, les messages doivent être compréhensibles et facilement compris 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 que le manuel dictionnaire et la grammaire. Le schéma est le document que les deux systèmes devraient savoir, que quiconque écrit le code d'analyse syntaxique dans chaque système doit savoir, et qui comprend la déclaration de l'espace de noms.

Chaque espace de noms est nommé comme un URI, qui, dans la plupart des cas est l'emplacement du document de schéma qui la définit.

Bien sûr, pas tous les documents XML a besoin d'un espace de noms, en particulier quand il ne sert pas à transmettre des informations à un système distant. Par exemple, lorsque vous sérialiser des objets en XML pour persister dans votre base de données.

5
Yuval

Nous utilisons des espaces de noms parce que les gens XEP veulent utiliser les mêmes mots pour signifier différentes choses dans leur propre idaho privé. Habituellement, vous pouvez déterminer du contexte ce que signifie une personne. Dans une base de données de personnel, le XML est des enregistrements de personnel. Dans une base de données de registre de véhicule, le XML est des enregistrements de registre de véhicule.

Les deux gardent une balise nommée "emplacement", mais la balise signifie différentes choses à chacun et contient différents champs.

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

Les espaces de noms XML associent avec chaque balise XML une URI, de sorte que le nom de la balise a elle-même une URL devant elle, qui fait partie du nom de la balise (bien sûr, les documents XML réels utilisent un raccourci. En choisissant soigneusement l'URI, il est facile d'être confiant que les noms de balises ne se heurtent pas - c'est comme si les deux balises de localisation étaient nommées totalement différemment, il n'y a donc aucune confusion. En tant que bonus, les deux balises d'emplacement entièrement différents peuvent inclure des éléments de la base de données des comptes et d'indiquer explicitement qu'ils 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: trouvez-moi toutes les sections accounts:account overdue partout dans ce XML. Ou: Trouvez-moi des éléments accounts:warning message articles n'importe où dans cette partie de XML particulière de XML, où le message d'avertissement est un nœud enfant (aussi profond) du nœud personnel:payment ou d'un code vehicle:status noeud.

Cette expression XPath pourrait être utilisée quelque part dans un document XSLT, dont le travail est de convertir le XML en XHTML ou XPDF, à l'affichage.

Quel est le gain? Pourquoi le faire? Parce que vous pouvez rechercher le fichier journal XML, retirez tous les messages de retard de comptes où qu'ils apparaissent, sans les confondre avec des balises "Message" produits par d'autres systèmes , Convertissez-les à XHTML et les afficher en gras audacieux via une balise CSS: Tout sans écrire de déchets de code de procédure.

3
paulmurray

Par exemple: Espaces de noms XML par exemple

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

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

et vous souhaitez fusionner des données dans ce document, qui a un même nom, mais un autre sens (alors valeur à), vous devez utiliser un espace de noms:

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

Ofcourse - vous pouvez changer un nom d'attribut. Par exemple, "my_unique_color". Bourgeon dans un autre document, il peut y avoir un attribut avec le même nom. Donc, si vous avez une espace de noms unique (notre domaine Web par exemple), vous pouvez toujours utiliser les mêmes noms d'éléments et/ou d'attributs avec tous les problèmes.

1
TcKs