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



xsd openclassroom (4)

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

D'abord, un xsd comme celui posté ci-dessus. Il utilise le préfixe 'xsd' pour l'espace de noms du schéma et un espace de nom par défaut pour le targetNamespace:

<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émas choisissent le premier ou le dernier, car si l'espace de noms par défaut est disponible, nous pourrions aussi bien l'utiliser pour quelque chose .

Dans un document de schéma XML, si j'ai à la fois le targetNamespace et les 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 obtiennent cet espace de noms et ... il en va de même pour targetNamespace.


Answer #1

targetNamespace est un attribut de l'élément schema qui définit l'espace de noms, c'est-à-dire le package dans le fichier XSD. Par convention, nous utilisons des URI / URL, mais nous pouvons utiliser n'importe quelle chaîne.

xmlns est un attribut utilisé pour référencer les éléments et les types de données qui proviennent de la valeur de l'attribut xmlns pour la portée de l'élément courant.

Par exemple:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" est avec le préfixe comme xsd signifie que l'espace de nom doit être préfixé par xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" sans préfixe est par défaut
  • xmlns: p = "http://www.example.com/Personnes" est avec le préfixe car p signifie que l'espace de nom doit être préfixé avec p:

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

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


Answer #2

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

<?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 valide le document ci-dessous:

<?xml version="1.0"?>

<recipe xmlns="http://yyyzzz.com">
    Deciphering the purpose of targetNamespace
</recipe>

La raison qui fonctionne est que xmlns = "http://yyyzzz.com" se lie automatiquement à l'élément défini par le schéma aussi! 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 aussi et regarde 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> 

Ignorez si les autres xmlns sont manquants, mais regardez plutôt attentivement type = "EGboy: recipeType" . On ne peut plus compter sur les xmlns car il a donc une valeur différente, il faut mettre 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 se réfère aux xmlns appropriés au cas où il y en aurait plusieurs.


Answer #3

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'attribut 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 référencés plus loin ailleurs dans le même fichier (par exemple un simple type global utilisé comme type pour un attribut ou un élément).

D'après mon expérience, de nombreux auteurs de XML Schema considèrent cela comme une «meilleure pratique» ... vous êtes donc sur la bonne voie.

En termes de XSD, targetNamespace prescrit la partie de l'espace de noms d'un nom qualifié d'un composant de schéma, qui comprend des éléments, des attributs, des groupes et des groupes d'attributs, ainsi que des 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, tels que les types, peuvent être référencés via l'attribut xsi:type dans les documents XML d'instance. Le reste (groupes, groupes d'attributs) est là pour faciliter la composition du schéma (à travers des références).

Je suis également d'avis que (en général) les gens viennent à concevoir 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 attribut targetNamespace correspondant.

  • modélisation pure. Vous pensez alors que targetNamespace est similaire à un package UML, ou un schéma de base de données, ou un package Java, ou un espace de noms .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 de partition des modèles dans les domaines, etc.





prefix