targetNamespace et xmlns sans préfixe, quelle est la différence?

Dans un document de schéma XML, si j’ai à la fois le targetNamespace et le xmlns sans préfixe .

 

Quelle est la différence exacte entre eux? Ma compréhension est que si vous avez un xmlns sans préfixe, tous les éléments sans préfixe obtiennent cet espace de nommage et … confusément, il en va de même pour targetNamespace.

targetNamespace est un “artefact” de schéma XML; son but: indiquer quel espace de noms XML particulier le fichier de schéma décrit.

xmlns – parce que le schéma XML est un document XML, il est alors possible de définir un espace de noms XML par défaut pour le fichier XML lui-même (c’est ce que fait l’atsortingbut xmlns); les implications sont multiples: création et composition. Par exemple, il n’est pas nécessaire d’utiliser un préfixe pour les éléments définis dans le schéma, qui sont par la suite référencés ailleurs dans le même fichier (par exemple, un simpleType global utilisé comme type pour un atsortingbut ou un élément).

D’après mon expérience, de nombreux auteurs de XML Schema considèrent cela comme une “meilleure pratique” … de sorte que vous êtes sur la bonne voie.

En termes de XSD, le targetNamespace prescrit la partie d’espace de noms d’un nom qualifié d’un composant de schéma, qui inclut des éléments, des atsortingbuts, des groupes et des groupes d’atsortingbuts, ainsi que des types simples et complexes. Certains des noms qualifiés définis dans un XSD (éléments et atsortingbuts) sont “directement” utilisés par un document d’instance XML. D’autres, tels que les types, peuvent être référencés via l’atsortingbut xsi: type dans les documents XML d’instance. Le rest (groupes, groupes d’atsortingbuts) est là pour faciliter la composition du schéma (par le biais de références).

Je pense aussi que (en général) les gens conçoivent le XSD sous deux angles:

  • pour correspondre à un XML existant. Dans ce cas, si votre XML utilise des espaces de noms, pour chacun des espaces de noms utilisés, vous obtiendrez un élément de schéma XSD avec un atsortingbut targetNamespace correspondant.

  • pure modélisation. Vous pensez alors à targetNamespace comme un package UML, un schéma de firebase database, un package Java ou un espace de noms .NET, et tout ce que cela signifie dans ce cas. Fondamentalement, il s’agit d’un mécanisme permettant d’éviter de nommer les collisions; néanmoins, c’est aussi un mécanisme de partition des modèles dans des domaines, etc.

Pour ceux qui sont encore confus, considérez ces trois xsd. Ils définissent tous un type global et une définition d’élément global qui le référence.

Tout d’abord, un xsd comme celui affiché ci-dessus. Il utilise le préfixe «xsd» pour l’espace de noms du schéma et un espace de noms par défaut pour le targetNamespace:

       

Maintenant, le même xsd, mais en définissant et en utilisant un préfixe d’espace de noms pour l’espace de noms cible:

       

… et enfin, une version utilisant un espace de noms par défaut au lieu de ‘xsd’ pour l’espace de noms du schéma XML:

       

La plupart des auteurs de schéma choisissent le premier ou le dernier, car si la fonction d’espace de nom par défaut est disponible, nous pourrions aussi bien l’utiliser pour quelque chose .

xmlns

L’atsortingbut xmlns définit l’espace de nom par défaut de l’élément décrit. L’espace de nom par défaut est donc appliqué à tous les éléments de l’élément décrit, qui ne déclarent pas explicitement un autre espace de nom pour eux-mêmes.

L’espace de noms par défaut est défini sur une valeur standard pour les fichiers WSDL: http://www.w3.org/ns/wsdl

targetNameSpace

Cet atsortingbut contient l’espace de nom de votre service Web. Vous pouvez choisir cet espace de nom librement, mais il existe une convention indiquant que l’URI doit pointer sur le WSDL du service.

xmlns: tns

Cet espace de nom doit être défini sur le même URI que l’atsortingbut targetNameSpace. De cette façon, vous pouvez vous référer à l’espace de nom cible via ce préfixe d’espace de nom (tns).

Source: http://tutorials.jenkov.com/wsdl/description.html

targetNamespace est un atsortingbut de l’élément de schema définit l’espace de noms, c’est-à-dire le package dans le fichier XSD. Par convention, nous utilisons les adresses URI / URL, mais nous pourrions utiliser n’importe quelle chaîne.

xmlns est un atsortingbut utilisé pour référencer les éléments et les types de données provenant de la valeur d’atsortingbut xmlns pour la scope de l’élément en cours.

Par exemple:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" est préfixé par le fait que xsd signifie que l’espace de noms doit être préfixé par xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" sans préfixe par défaut
  • xmlns: p = “http://www.example.com/People” est avec le préfixe car p signifie que l’espace de noms doit être préfixé avec p:

xmlns:xsd et xmlns:p sont QNames et xmlns est le nom local.

L’image suivante aide à comprendre XSD en utilisant l’analogie Java selon mes connaissances:

entrer la description de l'image ici

Après quelques tests approfondis utilisant xmllint, je pense avoir trouvé l’explication définitive ici. Considérons le schéma ci-dessous:

 < ?xml version="1.0" encoding="utf-8"?>            

Le schéma ci-dessus valide le document ci-dessous:

 < ?xml version="1.0"?>  Deciphering the purpose of targetNamespace  

La raison pour laquelle cela fonctionne est que xmlns = “http://yyyzzz.com” se lie aussi automatiquement à l’élément défini par le schéma! Cela signifie qu’il se lie également à l’élément recipeType .

Maintenant, avec le même document XML mais avec un schéma légèrement modifié comme ci-dessous, valide également et examine de près la différence:

 < ?xml version="1.0" encoding="utf-8"?>            

Ignorez si les autres xmlns ont disparu, mais examinez de près le type = “EGboy: recipeType” . Nous ne pouvons plus compter sur les xmlns car ils ont une valeur différente. Par conséquent, nous devons placer le préfixe EGboy devant recipeType .

Le document xml ne se soucie même pas du préfixe EGboy, ce préfixe est seulement pour que le schéma fasse référence aux xmlns appropriés au cas où il y en aurait beaucoup.