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.
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.
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.
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.
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 Standardp
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:
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 -
.xsd
Ist die Artefakt-/.jar
- Dateixmlns
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.
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 -
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.