targetNamespace et xmlns sans préfixe, quelle est la différence?
dans un document de schéma xml, si j'ai à la fois l'espace targetnam et le xmlns sans préfixe .
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/" xmlns="http://example.com/">
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 ont cet espace de noms et...il en va de même pour targetNamespace.
5 réponses
targetNamespace est un schéma XML" artefact"; son but: indiquer quel espace de nom 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 nom XML par défaut pour le fichier XML lui-même (c'est ce que fait l'attribut xmlns); les implications sont multiples: authoring, et composition. Par exemple, on ne doit pas utiliser un préfixe pour les éléments définis dans le schéma, qui sont ensuite référencés dans le même fichier (par exemple un mondial simpleType utilisé comme type d'un attribut ou un élément).
d'après mon expérience, de nombreux auteurs de schémas XML considèrent qu'il s'agit d'une"pratique exemplaire"... ainsi, vous êtes sur la bonne voie.
en termes de XSD, targetNamespace prescrit la partie namespace d'un nom qualifié d'un composant de schéma, qui inclut des éléments, des attributs, des groupes et des attributs groupes, et les types simples et complexes. Certains des noms qualifiés définis dans un XSD (éléments et attributs) sont "directement" utilisés par un document D'instance XML. D'autres, comme pour les types, peuvent être référencés par l'attribut xsi:type dans les documents XML d'instance. Les autres (groupes, groupes d'attributs) sont là pour faciliter la composition du schéma (par des références).
je suis également d'avis que (en général) les gens viennent à la conception XSD de deux angles:
-
pour correspondre à un XML existant. Dans ce cas, si votre XML utilise des namespaces, pour chacun des namespaces utilisés, vous finirez avec un élément de schéma XSD avec un attribut targetNamespace correspondant.
-
pure modélisation. Vous pensez alors à targetNamespace similaire à un paquet UML, ou un schéma de base de données, ou un paquet Java, ou un namespace.net, et tout ce que cela signifie dans ce cas. Fondamentalement, c'est un mécanisme pour éviter de nommer les collisions; néanmoins, c'est aussi un mécanisme pour cloisonner les modèles dans les 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 s'y réfère.
D'abord, un xsd comme celui affiché ci-dessus. Il utilise le préfixe 'xsd' pour l'espace de noms schema, et un espace de noms par défaut pour l'espace de noms targetnam:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/"
xmlns="http://example.com/">
<xsd:element name="aGlobalElement" type="aGlobalType"/>
<xsd:simpleType name="aGlobalType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
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:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/"
xmlns:tns="http://example.com/">
<xsd:element name="aGlobalElement" type="tns:aGlobalType"/>
<xsd:simpleType name="aGlobalType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
...et enfin, une version qui utilise un espace de noms par défaut au lieu de' xsd 'pour L'espace de noms du schéma XML:
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/"
xmlns:tns="http://example.com/">
<element name="aGlobalElement" type="tns:aGlobalType"/>
<simpleType name="aGlobalType">
<restriction base="string"/>
</simpleType>
</schema>
la plupart des auteurs de schéma choisissent le premier ou le dernier, parce que si la facilité d'espace de noms par défaut est disponible alors nous pourrions aussi bien l'utiliser pour quelque chose .
xmlns
l'attribut 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 à l'intérieur de l'élément décrit, qui ne déclarent pas explicitement un autre espace de nom pour eux-mêmes.
l'espace de nom par défaut est défini à une valeur standard pour les fichiers WSDL: http://www.w3.org/ns/wsdl
targetNameSpace
cet attribut contient l'Espace nom de votre service web. Vous pouvez choisir librement cet espace de nom, mais il y a une convention qui dit que L'URI doit pointer vers le WSDL du service.
xmlns:tns
cet espace de nom doit être défini à la même URI que l'attribut 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).
targetNamespace
est un attribut de l'élément schema
. Par convention nous utilisons URI / URLs, mais nous pouvons utiliser n'importe quelle chaîne.
xmlns
est un attribut utilisé pour renvoyer des éléments et des types de données qui proviennent de la valeur de l'attribut xmlns pour l'élément courant scope.
Par Exemple:
-
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
est précédé du préfixexsd
signifie espace de noms doit être précédé dexsd:
-
xmlns="http://www.w3.org/2001/XMLSchema"
sans préfixe est par défaut - xmlns:p="http://www.example.com/People" c'est avec le préfixe
p
désigne l'espace de noms doit être préfixé parp:
où xmlns:xsd
et xmlns:p
sont des noms qn et xmlns
est un nom local.
l'image suivante aide à comprendre XSD en utilisant L'analogie Java à ma connaissance:
après quelques tests approfondis en utilisant xmllint je pense que j'ai trouvé l'explication définitive ici. Considérons le schéma suivant:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns:p="http://abced.com"
xmlns:q="http://pqr.com"
xmlns="http://yyyzzz.com">
<xsd:element name="recipe" type="recipeType" />
<xsd:complexType name="recipeType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="desc" type="xsd:string" />
<xsd:attribute name="archetype" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>
le schéma ci-dessus est valable pour le document suivant:
<?xml version="1.0"?>
<recipe xmlns="http://yyyzzz.com">
Deciphering the purpose of targetNamespace
</recipe>
la raison pour laquelle cela fonctionne est parce que xmlns="http://yyyzzz.com " se lie automatiquement à l'élément défini par le schéma! Cela signifie qu'il se lie aussi au recipeType element.
maintenant, avec le même document xml mais avec un schéma légèrement modifié comme ci-dessous valide aussi et jette un oeil de près à la différence:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns="http://eigenfield.aparicio.com"
xmlns:EGboy="http://yyyzzz.com">
<xsd:element name="recipe" type="EGboy:recipeType" />
<xsd:complexType name="recipeType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="desc" type="xsd:string" />
<xsd:attribute name="archetype" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>
Ignore si l'autre xmlns est porté disparu, mais regarde plutôt de près type=" EGboy:recipeType " . Nous ne pouvons plus compter sur le xmlns parce qu'il a une valeur différente donc, nous devons mettre le préfixe EGboy devant recipeType .
le document xml ne s'occupe même pas du préfixe EGboy ce préfixe n'est que pour le schéma de renvoyer au xmlns au cas où il y en aurait plusieurs.