Pourquoi avons-nous besoin de targetNamespace?

J’aimerais comprendre le but de targetNamespace tel qu’utilisé à la fois dans XML Schema et dans WSDL. En fait, pour simplifier les choses, limitons cette question au schéma XML.

J’ai l’impression de bien comprendre la notion d’espaces de noms XML (simples). Par convention, nous utilisons les URL / URI, mais nous pourrions utiliser n’importe quelle chaîne, que nous assignons ensuite à un préfixe pour une réutilisation par les nœuds et atsortingbuts XML, ou simplement comme espace de noms par défaut pour la scope à scope de main. Jusqu’ici tout va bien ?

Entrent maintenant dans le schéma XML. Pour une raison quelconque, les inventeurs de XML Schema ont estimé que la notion d’espaces de noms simples ne suffisait pas et ils ont dû introduire le targetNamespace. Ma question est la suivante: quel avantage significatif un targetNamespace introduit ne pourrait-il pas être fourni par un espace de noms XML normal? Si un document XML fait référence à un document xsd, soit par schemaLocation, soit par une instruction import, dans les deux cas, je donne le chemin du document xsd réel référencé. C’est ce qui définit de manière unique le schéma auquel je veux me référer. Si, en outre, je souhaite associer ce schéma à un espace de noms particulier dans mon document de référence, pourquoi devrais-je être obligé de répliquer le targetNamespace précis déjà défini dans le schéma XML que je référence? Pourquoi est-ce que je ne pourrais pas simplement redéfinir cet espace de nommage comme je le souhaite dans le document XML dans lequel cet espace de noms sera utilisé pour faire référence à ce document XML Schema particulier que je veux référencer?

Mettre à jour:

Pour donner un exemple, si j’ai les éléments suivants dans un document d’instance XML:

John 28 59 Red 4 2

Pourquoi, par exemple, le schéma people.xsd doit-il définir un targetNamespace qui est “http://contoso.com/schemas/People”? Pourquoi avons-nous besoin de la définition de targetNamespace dans le document xsd? Il me semble que tout ce que vous avez à gagner de la partie namespace de schemaLocation est déjà contenu dans le document d’instance XML. Quel est l’avantage d’imposer l’existence d’un targetNamespace de valeur égale dans le document xsd?

Question de suivi à la réponse de Paul:

Pouvez-vous me donner un exemple concret où de tels «conflits» entre les noms d’éléments xsd deviennent évidents et cela expliquerait la nécessité de targetNamespace?


Ok, voici une tentative de répondre à ma propre question. Faites-moi savoir si cela vous semble cohérent. Regarder les exemples sur la page liée par Paul m’a aidé.

Si nous prenons l’exemple d’instance XML dans la question initiale ci-dessus, nous avons deux références à la définition de l’élément véhicule. L’un est explicite et visible dans le document d’instance XML lui-même, mais nous devons également imaginer que le schéma XML person.xsd fait de nouveau référence à la même définition de véhicule qu’un élément enfant autorisé de la personne. Si nous utilisions des espaces de noms normaux où chaque document était autorisé à définir son propre espace de noms pour véhicule, comment saurions-nous que l’instance XML fait référence à la même définition de schéma XML pour véhicule que la personne.xsd? Le seul moyen est d’appliquer un concept d’espace de noms plus ssortingct que le simple d’origine et qui doit être écrit exactement de la même manière sur plusieurs documents.

Si je n’écrivais pas cela sur une tablette, je fournirais un exemple de code, mais j’essaierai simplement de décrire l’exemple que j’ai en tête.

Imaginons que nous ayons deux définitions de schéma XML différentes pour un élément de véhicule. location1 / vehicles.xsd contiendrait la définition qui valide l’exemple de la question de cet article (contenant des éléments color, wheels et seats), alors que location2 / vehicles.xsd contiendrait une définition entièrement différente pour un élément de véhicule, par exemple , avec les éléments enfants année, modèle et volume). Maintenant, si le document d’instance XML fait référence au schéma location1, comme c’est le cas dans l’exemple ci-dessus, mais person.xsd dit que l’élément person peut contenir un élément enfant véhicule du type défini dans le schéma location2, alors sans la notion dans un targetNamespace, l’instance XML validerait, même si elle n’a manifestement pas le bon type de véhicule en tant qu’élément enfant de son élément person.

Les espaces de noms cibles nous aident ensuite à nous assurer que si deux documents différents référencent le même troisième schéma XML, ils se réfèrent tous deux au même schéma et pas seulement à un schéma contenant des éléments similaires, mais non identiques. .

Cela a-t-il un sens ?

Vous semblez être sur la bonne voie. Je vais faire quelques remarques ici qui pourraient aider.

  • Dans un document d’instance, vous utilisez des espaces de noms XML pour identifier l’espace de noms dans lequel se trouve un élément ou un atsortingbut.
  • Dans un document de schéma, vous déclarez des éléments et des atsortingbuts qui apparaîtront dans les instances. Dans quel espace de nommage sont-ils déclarés? C’est à quoi cible targetNamespace.
  • L’emplacement du document de schéma et l’espace de noms ne sont pas la même chose. Il est assez courant d’avoir plusieurs documents .xsd avec le même targetNamespace. (Ils peuvent ou non s’inclure, mais s’incluent généralement les uns les autres.)
  • Les documents d’instance ne comportent pas toujours d’élément xsi: schemaLocation pour indiquer aux parsingurs où localiser les schémas. Diverses méthodes peuvent être utilisées pour indiquer à un parsingur où trouver les documents de schéma pertinents. Un XSD peut être situé sur un disque local ou à une adresse Web et cela ne doit pas affecter l’espace de noms des éléments qu’il contient.
    • xsi: schemaLocation est un indice. Les parsingurs syntaxiques peuvent localiser ailleurs le schéma de l’espace de noms donné, ce qui implique qu’ils doivent être en mesure de savoir à quel espace de noms correspond un schéma.
    • Les outils, tels que les outils de liaison de données, précomstackront les schémas et produiront un code reconnaissant les documents valides. Ceux-ci doivent pouvoir connaître les espaces de noms des éléments déclarés.

Je pense que ce que vous supposiez, c’est que le document d’instance pourrait spécifier l’espace de noms des éléments et des atsortingbuts déclarés dans un document de schéma, en utilisant xsi: schemaLocation. Cela ne fonctionne pas. D’une part, l’parsingur peut localiser d’autres documents de schéma que ceux répertoriés, et il doit savoir à quel espace de noms ils sont destinés. D’autre part, cela rendrait le raisonnement sur les schémas difficile ou impossible: vous ne pourriez pas regarder un schéma et connaître les espaces de noms dans lesquels tout appartenait, car cette décision serait rescope jusqu’à ce qu’une instance soit écrite.

Q: “Par convention, nous utilisons les adresses URI / URL, mais nous pourrions utiliser n’importe quelle chaîne, que nous assignons ensuite à un préfixe pour une réutilisation par les nœuds et atsortingbuts XML, ou simplement comme espace de noms par défaut pour la scope.”

A: Oui, exactement

Q: “Pour une raison quelconque, les inventeurs de XML Schema ont estimé que la notion d’espaces de noms simples ne suffisait pas et ils ont dû introduire le targetNamespace.”

A: http://www.liquid-technologies.com/Tutorials/XmlSchemas/XsdTutorial_04.aspx

Casser des schémas en plusieurs fichiers peut avoir plusieurs avantages. Vous pouvez créer des définitions réutilisables pouvant être utilisées dans plusieurs projets. Ils facilitent la lecture et la version des définitions car ils décomposent le schéma en unités plus petites et plus simples à gérer.

Tout fonctionne très bien sans les espaces de noms, mais si différentes équipes commencent à travailler sur des fichiers différents, alors vous avez la possibilité de conflits de noms, et la définition ne serait pas toujours évidente. La solution consiste à placer les définitions de chaque fichier de schéma dans un espace de noms distinct.

Clarification:

  • Le but principal des schémas XML est de déclarer des “vocabulaires”.

  • Ces vocabulaires peuvent être identifiés par un espace de nom spécifié dans l’atsortingbut targetNamespace.

  • Le schéma (un document XML) peut avoir un “espace de noms”. Le “vocabulaire” décrit dans le document peut avoir un “targetNamespace”.

  • Tout comme les schémas XML fournissent un niveau d’abstraction supérieur à celui des DTD SGML (les architectes originaux de XML pensaient que les DTD étaient suffisantes), les schémas XML «targetNamespaces» fournissent un niveau d’abstraction par rapport aux «espaces de noms simples».

‘J’espère que cela pourra aider

Je pense qu’il est utile d’examiner à la fois le document d’instance et le document de schéma pour comprendre ce que fait targetNamespace. Considérez ceci (basé sur votre document d’instance):

  John 28 59  Red 4 2   

Il n’y a pas d’espace de noms par défaut spécifié pour le document, mais p: * et v: * sont associés à des URI NS spécifiques. Regardez maintenant le document de schéma lui-même:

               

et

             

Si vous examinez les atsortingbuts des balises, l’espace de noms par défaut est ” http://www.w3.org/2001/XMLSchema ” pour les deux documents de schéma, mais le targetNamespace est celui utilisé comme espace de nom aliasé dans le fichier. document d’instance.

targetNamespace est l’espace de noms attendu des instances, quel que soit l’espace de noms des documents de schéma et de tout autre espace de noms spécifié dans le document d’instance.

Je trouve plutôt utile de penser à organiser une fête où vous avez une liste d’invités et des invités portant des étiquettes de nom. Pensez au targetNamespace dans les documents de schéma comme les noms de la liste d’invités. Les xmlns, aliasés ou non, dans les documents d’instance sont comme les tags de nom sur les invités. Tant que vous avez la liste d’invités (qui comprend miraculeusement une photocopie de leur pièce d’identité émise par l’État), chaque fois que vous rencontrez quelqu’un, vous pouvez valider leur identité. Si vous rencontrez une personne portant une étiquette qui ne correspond pas aux parameters joints, vous pouvez paniquer (par exemple, lancer une erreur).

Avec le schéma / les instances, vous avez:

Schémas:

 targetNamespace="http://localhost:8080/scribble/xml/Person" targetNamespace="http://localhost:8080/scribble/xml/Vehicle" 

Exemple:

 xmlns:p="http://localhost:8080/scribble/xml/Person" xmlns:v="http://localhost:8080/scribble/xml/Vehicle" 

Ou … tout invité surnommé “v” que vous rencontrez n’importe où dans la fête (sauf règles spéciales qui disent le contraire), n’importe quel étage de la maison ou dans la cour ou dans la piscine, correspond mieux à la description d’un invité sur l’invité liste nommée http: // localhost: 8080 / scribble / xml / Vehicle . ou ils sont un intrus.

Ces règles spéciales peuvent dire quelque chose comme, V ne peut sortir que si elles sont immédiatement à côté de P, ou P ne peut sortir que si V est présent. Dans ce cas, P doit se bloquer quand V est là, mais V peut aller à peu près n’importe où sans que A y soit.

De cette façon, un schéma peut être incroyablement flexible, définissant à peu près toutes les structures de données souhaitées et capable de suivre ce qui se passe simplement en faisant correspondre les espaces de noms (par défaut ou préfixés) à un TNS et au schéma associé.

Ce n’est pas clair pour moi exactement ce que vous demandez. Il est clair qu’un schéma peut contenir des définitions de composants dans de nombreux espaces de noms, et il doit y avoir un moyen de dire “Ceci est une déclaration de l’élément E dans l’espace de noms N”. Les concepteurs de XSD ont choisi de concevoir le langage de sorte que toutes les déclarations dans un document de schéma appartiennent au même espace de noms, appelé espace de noms cible du module. Il aurait pu être emballé différemment, mais la différence serait très superficielle. Selon vous, qu’est-ce qui ne va pas dans la décision d’aligner les modules avec les espaces de noms?