Warum brauchen wir targetNamespace?

Ich würde gerne verstehen, den Sinn des targetNamespace-wie sowohl in XML-Schema-und WSDL. In der Tat, Dinge einfach zu halten, lassen Sie uns begrenzen, diese Frage zu XML-Schema.

Fühle ich mich wie ich voll verstehen, den Begriff der (einfachen) XML-namespaces. Per Konvention verwenden wir URI/URLs, aber wir könnten jede beliebige Zeichenfolge verwenden, die wir dann zuordnen, um ein Präfix für die Wiederverwendung von XML-Knoten und-Attributen, oder verwenden Sie einfach als Standard-namespace für den Bereich an der hand. So weit, So gut ?

Nun in XML-Schema. Für einige Grund, der Erfinder von XML-Schema spürte den Begriff der einfachen namespaces war nicht genug, und Sie hatte die Einführung der targetNamespace. Meine Frage ist : was erhebliche Vorteile hat eine targetNamespace einzuführen, konnte nicht zur Verfügung gestellt werden, die von einem normalen XML-namespace ? Wenn ein XML-Dokument verweist auf ein xsd-Dokument, entweder durch schemaLocation-Attribut oder mit einer import-Anweisung in jedem Fall gebe ich den Pfad zur eigentlichen xsd-Dokument referenziert werden. Dies ist, was definiert eindeutig das Schema möchte ich verweisen. Wenn außerdem will ich binden Sie dieses Schema, um ein bestimmtes namespace in meinem verweisenden Dokument, warum sollte ich verpflichtet sein, zu replizieren, die präzise targetNamespace bereits definierte XML-Schema ich bin Referenzierung? Warum konnte ich nicht einfach neu definieren, diesen namespace möchte ich aber innerhalb des XML-Dokuments, in dem dieser namespace wird verwendet, um zu verweisen, dass insbesondere XML-Schema-Dokument möchte ich verweisen ?

Update:

Um ein Beispiel zu geben, wenn ich das folgende in eine XML-Instanz-Dokument:

<p:Person
   xmlns:p="http://contoso.com/People"
   xmlns:v="http://contoso.com/Vehicles"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation=
    "http://contoso.com/schemas/Vehicles
     http://contoso.com/schemas/vehicles.xsd
     http://contoso.com/schemas/People
     http://contoso.com/schemas/people.xsd">
   <name>John</name>
   <age>28</age>
   <height>59</height>
   <v:Vehicle>
      <color>Red</color>
      <wheels>4</wheels>
      <seats>2</seats>
   </v:Vehicle>
</p:Person>

Warum z.B. die Menschen.xsd-Schema definiert werden muss targetNamespace ist "http://contoso.com/schemas/People"? Warum brauchen wir die targetNamespace-definition im xsd-Dokument überhaupt? Es scheint mir, alle, die Sie haben, um aus der namespace-Teil des schemaLocation-Attribut ist bereits enthalten in der XML-Instanz-Dokument. Was ist der Vorteil der Durchsetzung der Existenz einer targetNamespace mit gleichem Wert über die im xsd-Dokument ?

Follow-up-Frage an Paul ' s Antwort:

Können Sie mir ein konkretes Beispiel, wo solche "Zusammenstöße" zwischen xsd-element-Namen wird deutlich, und das würde erklären, die Notwendigkeit für targetNamespace ?


Ok, hier ein Versuch der Antwort auf meine eigene Frage. Lassen Sie mich wissen, wenn es scheint, kohärent zu Ihnen. Betrachten Sie die Beispiele auf der verlinkten Seite von Paul half mir.

Wenn wir die XML-Instanz, die beispielsweise in der ursprünglichen Frage erwähnt, wir haben zwei Verweise auf die definition von Fahrzeug element. Eine explizite und sichtbar in der XML-Instanz-Dokument selbst, aber wir müssen uns auch vorstellen, dass die person.xsd-XML-Schema-Referenzen das gleiche Fahrzeug definition wieder als ein zulässiges child-element der person. Wenn wir normal namespaces, in denen jedes Dokument, durften Sie definieren einen eigenen Namensraum für die Fahrzeug -, wie würden wir wissen, dass die XML-Instanz verweist, die die XML-Schema-definition für das Fahrzeug ist die person.xsd ? Die einzige Möglichkeit ist, sich mit der Durchsetzung eines Konzepts der namespace, die strenger als die ursprüngliche, einfache ein-und die müssen geschrieben werden, die genau den gleichen Weg über mehrere Dokumente.

Wenn ich nicht diese schreiben auf einem tablet, ich würde ein code-Beispiel, aber hier werde ich nur versuchen zu beschreiben, das Beispiel, das ich im Sinn haben.

Mir vorstellen, dass wir zwei verschiedene XML-Schema-Definitionen für ein Fahrzeug element. location1/Fahrzeuge.xsd enthält die definition bestätigt, dass das Beispiel aus der Frage von diesem post (mit Farbe, Räder und Sitze child-Elementen), in der Erwägung, dass location2/Fahrzeuge.xsd enthalten würde, eine völlig andere definition für ein Fahrzeug element (sagen wir, mit child-Elemente, Jahr, Modell und Lautstärke). Nun, wenn die XML-Instanz-Dokument bezieht sich auf die location1-Schema, wie in dem Beispiel oben, sondern person.xsd sagt, dass die person element enthalten kann, die ein Fahrzeug Kind-element des Typs definiert ist, in der location2-Schema, dann ohne die Vorstellung von einem targetNamespace, die XML-Instanz validieren würde, obwohl es eindeutig nicht die richtige Art von Fahrzeug wie ein Kind-element von seiner person element.

Target-namespaces, dann helfen Sie uns sicherzustellen, dass, wenn zwei verschiedene Dokumente verweisen auf dieselbe Dritte XML Schema, Sie sind beide in der Tat, verweisen auf das gleiche Schema und nicht nur ein Schema, das Elemente enthält, die ähnlich, aber nicht identisch zu einem der anderen...

Ist das sinnvoll ?

InformationsquelleAutor der Frage Student | 2012-03-24

Schreibe einen Kommentar