wake-up-neo.com

targetNamespace und xmlns ohne Präfix, was ist der Unterschied?

Wenn ich in einem XML-Schemadokument sowohl den targetNamespace als auch den xmlns ohne Präfix habe.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://example.com/" xmlns="http://example.com/">

Was ist der genaue Unterschied zwischen ihnen? Mein Verständnis ist, dass wenn Sie eine XML-Datei ohne Präfix haben, alle Elemente ohne Präfix diesen Namespace erhalten und ... verwirrenderweise dasselbe gilt für targetNamespace.

70
Abe

targetNamespace ist ein XML-Schema "Artefakt"; Der Zweck: Angeben, welchen bestimmten XML-Namespace die Schemadatei beschreibt.

xmlns - Da das XML-Schema ein XML-Dokument ist, kann ein Standard-XML-Namespace für die XML-Datei selbst definiert werden (dies ist das xmlns-Attribut) tut); Die Auswirkungen sind vielfältig: Authoring und Komposition. Beispielsweise muss kein Präfix für die im Schema definierten Elemente verwendet werden, auf die später an anderer Stelle in derselben Datei verwiesen wird (z. B. ein globaler einfacher Typ, der als Typ für ein Attribut oder Element verwendet wird).

Meiner Erfahrung nach betrachten viele XML-Schema-Autoren dies als "Best Practice", damit Sie auf dem richtigen Weg sind.

In Bezug auf XSD schreibt der targetNamespace den Namespace-Teil eines qualifizierten Namens einer Schemakomponente vor, der Elemente, Attribute, Gruppen und Attributgruppen sowie einfache und komplexe Typen enthält. Einige der in einer XSD definierten qualifizierten Namen (Elemente und Attribute) werden von einem XML-Instanzdokument "direkt" verwendet. Andere, z. B. für Typen, können in XML-Instanzdokumenten über das Attribut xsi: type referenziert werden. Der Rest (Gruppen, Attributgruppen) dient zur Vereinfachung der Schemazusammenstellung (durch Verweise).

Ich bin auch der Meinung, dass (im Allgemeinen) Leute XSD aus zwei Blickwinkeln entwerfen:

  • eine vorhandene XML entsprechen. In diesem Fall erhalten Sie, wenn Ihre XML Namespaces verwendet, für jeden der verwendeten Namespaces ein XSD-Schemaelement mit einem passenden targetNamespace-Attribut.

  • reine Modellierung. Sie denken dann an targetNamespace, das einem UML-Paket oder Datenbankschema ähnlich ist, oder an ein Java -Paket oder einen .NET-Namespace, und alles, was dies in diesem Fall bedeutet. Grundsätzlich handelt es sich um einen zu vermeidenden Mechanismus Benennung von Kollisionen, dennoch ist es auch ein Mechanismus, um Modelle in Sachgebiete usw. zu unterteilen.

76
Petru Gardea

Betrachten Sie für diejenigen, die noch verwirrt sind, diese drei xsds. Sie alle definieren einen globalen Typ und eine globale Elementdefinition, die darauf verweist.

Erstens eine xsd wie die oben gepostete. Es verwendet das Präfix 'xsd' für den Schemanamensraum und einen Standardnamensraum für den Zielnamensraum:

<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>  

Jetzt die gleiche xsd, aber ein Namespace-Präfix für den Ziel-Namespace definieren und verwenden:

<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>  

... und schließlich eine Version, die einen Standardnamespace anstelle von 'xsd' für den XML-Schemanamespace verwendet:

<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>

Die meisten Schemaautoren wählen das erste oder das letzte, denn wenn die Standard-Namespace-Funktion verfügbar ist, können wir sie auch für irgendetwas verwenden.

19
kimbert

xmlns

Das xmlns-Attribut legt den Standardnamensraum des beschriebenen Elements fest. Der Standardnamensraum wird somit auf alle Elemente innerhalb des beschriebenen Elements angewendet, die nicht explizit einen anderen Namensraum deklarieren.

Der Standardnamensraum ist auf einen Standardwert für WSDL-Dateien festgelegt: http://www.w3.org/ns/wsdl

targetNameSpace

Dieses Attribut enthält den Namensraum Ihres Webdienstes. Sie können diesen Namensraum frei wählen, es gibt jedoch eine Konvention, die besagt, dass der URI auf die WSDL des Dienstes verweisen soll.

xmlns: tns

Dieser Namensraum sollte auf denselben URI wie das targetNameSpace-Attribut festgelegt werden. Auf diese Weise können Sie über dieses Namensraumpräfix (tns) auf den Zielnamensraum verweisen.

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

14
HakunaMatata

Namespace bedeutet wie Bereich

targetNamespace ist ein Attribut des Elements schema und definiert den Namespace, d. h. das Paket in der XSD-Datei. Gemäß der Konvention verwenden wir URI/URLs, können jedoch auch beliebige Zeichenfolgen verwenden.

xmlns ist ein Attribut, mit dem auf Elemente und Datentypen verwiesen wird, die vom xmlns-Attributwert für den aktuellen Elementbereich stammen.

Beispielsweise:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" Hat das Präfix xsd bedeutet, dass dem Namespace das Präfix xsd: Vorangestellt werden muss.
  • xmlns="http://www.w3.org/2001/XMLSchema" Ohne Präfix ist Standard
  • xmlns: p = "http://www.example.com/People" hat das Präfix p bedeutet, dass dem Namespace das Präfix p: vorangestellt werden muss.

Wobei xmlns:xsd Und xmlns:p QNames sind und xmlns der lokale Name ist.

Das folgende Bild hilft beim Verständnis von XSD unter Verwendung von Java Analogie nach meinem Wissen:

enter image description here

3
Premraj

Andere Antworten sind hier gut, deshalb werde ich ihre Erklärungen hier nicht wiederholen. Wenn jedoch jemand aus dem Java Hintergrund dessen einfachere findet, ist hier die Analogie, die ich mir ausgedacht habe -

  1. Das Dokument .xsd Ist die Artefakt-/.jar - Datei
  2. xmlns ist das

    package com.example
    

    anweisung, die Sie am Anfang Ihrer Java Klassen deklarieren.

Beachten Sie (aus Gründen der Analogie), dass Sie in Ihrem Java) -Projekt ein einzelnes Paket hatten und alle Klassen in einer einzelnen äußeren Klasse deklariert und definiert sind. Zum Beispiel

    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;
             ...
         }
    }

Auf diese Weise werden verschiedene Elemente in einer einzelnen .xsd - Datei für ein neues Schema gruppiert.

  1. targetNamespace ist der Name des Artefakts, das Sie erstellen. Wie Sie selbst herausfinden können, wird targetNamespace verwendet, wenn Erstellen eines Schemas in einer .xsd - Datei.

Sobald das Artefakt (oder die .xsd - Datei) erstellt wurde, können Sie es wie folgt in anderen Projekten verwenden:

In einem Java Projekt importieren Sie die Bibliothek mit der Datei pom.xml (Oder build.gradle) Wie folgt:

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

In XML "importieren" Sie das Schema mit

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

=== ANHANG ===

Klarstellung -

  1. xmlns wird sowohl als package -Anweisung als auch als import -Anweisung in Java verwendet. In der Datei .xsd Fungiert xmlns als Anweisung "package", während in den Dateien .xml Als Anweisung "import" fungiert. Aussage.
1
Akshayraj Kore