web-dev-qa-db-fra.com

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.

<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? Je comprends que si vous avez un xmlns sans préfixe, tous les éléments sans préfixe obtiennent cet espace de noms et ... ce qui porte à confusion, il en va de même pour targetNamespace.

70
Abe

targetNamespace est un schéma XML "artefact"; sa fonction: indiquer quel espace de noms XML particulier est décrit dans le fichier de schéma.

xmlns - Le schéma XML étant 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 l'attribut xmlns Est-ce que); 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 ultérieurement référencés ailleurs dans le même fichier (par exemple, un simpleType global utilisé comme type pour un attribut ou un élément).

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

En termes de XSD, targetNamespace prescrit la partie espace de nom 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 fichier 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 d'instance XML. Les autres (groupes, groupes d'attributs) sont là pour faciliter la composition du schéma (via des références).

Je suis également d'avis que (en général) les gens conçoivent XSD sous deux angles:

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

  • modélisation pure. Vous pensez alors à targetNamespace 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 ici. C'est fondamentalement un mécanisme permettant d'éviter nommer les collisions, mais c’est aussi un mécanisme pour partitionner les modèles dans des domaines, etc.

76
Petru Gardea

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

Premièrement, un xsd comme celui affiché ci-dessus. Il utilise le préfixe 'xsd' pour l'espace de nom 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 nom pour l'espace de nom 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 nom par défaut au lieu de 'xsd' pour l'espace de nom 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, car si la fonctionnalité d'espace de noms par défaut est disponible, nous pourrions aussi bien l'utiliser pour quelque chose.

19
kimbert

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 sur une valeur standard pour les fichiers WSDL: http://www.w3.org/ns/wsdl

targetNameSpace

Cet attribut contient l'espace de noms de votre service Web. Vous pouvez choisir librement cet espace de noms, mais il existe une convention stipulant que l'URI doit pointer vers le WSDL du service.

xmlns: tns

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

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

14
HakunaMatata

L'espace de noms signifie comme scope

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

xmlns est un attribut utilisé pour référencer des éléments et des types de données provenant de la valeur d'attribut xmlns pour la portée de l'élément en cours.

Par exemple:

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

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

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

enter image description here

3
Premraj

Les autres réponses sont bonnes ici, je ne vais donc pas répéter leurs explications ici. Cependant, si quelqu'un de l'arrière-plan Java, trouve que c'est plus simple, voici l'analogie que j'ai trouvée -

  1. .xsd document est l'artefact/.jar fichier
  2. xmlns est le

    package com.example
    

    déclaration, vous déclarez au sommet de vos Java classes.

Considérons (par analogie), si vous aviez un seul package dans votre projet Java) et que toutes les classes sont déclarées et définies dans une seule classe externe Par exemple,

    package com.furniture.models

    public class FurnitureShop {

         int noOfTables;
         int noOfChairs;
         int noOfBeds;
         List<Table> tables;
         List<Chair> chairs;
         List<Bed> beds;

         // and now instead of declaring and defining a class for table/chair/bed in a 
         // separate file, you just add it here 
         public static class Table {
             int height;
             int width;
             int length;
             ...
         }

         public static class Chair {
             String color;
             ChairType chairType;
             ...
         }

         public static class Sofa {
             int price;
             String color;
             ...
         }
    }

C’est ainsi que différents éléments sont regroupés dans un même .xsd fichier, pour un nouveau schéma.

  1. targetNamespace est le nom de l'artefact que vous créez . Comme vous pouvez le découvrir vous-même, targetNamespace est utilisé lorsque créer un schéma, dans un .xsd fichier

Une fois, l'artefact (ou .xsd fichier) est créé, vous l’utiliserez dans d’autres projets comme suit -

Dans un projet Java, vous importeriez la bibliothèque à l’aide de pom.xml (ou build.gradle) fichier comme suit -

    <dependency>
       <groupId>com.furniture</groupId>
       <artifactId>furniture-apis</artifactId>
       <version>1.1.1</version>
    </dependency>

En XML, vous "importez" le schéma en utilisant

    <furniture xmlns="http://furniture.com"/>

=== APPENDICE ===

Clarification -

  1. xmlns est utilisé à la fois comme instruction package, ainsi que comme instruction import en Java. Dans .xsd fichier, xmlns agit comme la déclaration "package", alors que dans .xml fichiers, il s’agit de l’instruction "import".
1
Akshayraj Kore