Namensraum-Verhalten importierter Komponenten

(Auszug aus "XML Schema" von Eric van der Vlist)

Sie wundern sich vielleicht darüber, daß für die Identifikation von Namensräumen für die durch das Schema definierten Elemente ein anderer Ansatz als für die durch W3C XML Schema definierten Datentypen verwendet wurde. Der Import eines Schemas erlegt der Verwendung von Namensräumen im importierten Schema gewisse Einschränkungen auf.

Wenn wir ein Element oder Attribut definieren, geben wir ihm einen Namensraum. Dieser Namensraum muß derselbe wie der Ziel-Namensraum des importierenden Schemas sein, selbst wenn der Datentyp des Elements bzw. Attributs zu einem anderen Namensraum gehört.

Die Regeln sind etwas anders, wenn wir ein Element oder Attribut durch Verweis auf eine Komponente (nicht einen Datentyp) definieren, die sich in einem anderen Namensraum befindet. In diesem Fall wird der Name der referenzierten Komponente importiert, und deren Namensraum muß der Ziel-Namensraum des importierten Schemas sein.

Um zu veranschaulichen, wie dies funktioniert, sehen wir uns zwei Methoden zur Erzeugung von Schemas genauer an, die in diesem einfachen Beispiel beschrieben sind:

<?xml version="1.0"?>
<!-- Namensraum: http://dyomedea.com/ns/library -->
<library xmlns:ppl="http://dyomedea.com/ns/people" xmlns="http://dyomedea.com/ns/library">
   <book id="b3810518883">
      <title>
         Auf den Hund gekommen
      </title>
      <authors>
         <ppl:person id="CMS">
            <ppl:name>
               Charles M. Schulz
            </ppl:name>
         </ppl:person>
      </authors>
   </book>
</library>

Dieses Dokument enthält zwei Namensräume. Alles außer den Inhalten des Elements authors ist im Namensraum "http://dyomedea.com/ns/library". Die Inhalte des Elements authors (ppl:person und ppl:name) sind im Namensraum "http://dyomedea.com/ns/people".

Wir haben für die Darstellung dieses Dokuments mit Hilfe von W3C XML Schema im wesentlichen zwei Möglichkeiten. Beide Ansätze beginnen, indem sie ein Schema für die Elemente im Namensraum "http://dyomedea.com/ns/library" definieren. Der erste Ansatz importiert das Schema, das den Namensraum "http://dyomedea.com/ns/people" definiert, und verwendet dann einen Verweis auf das Element ppl:person, um es innerhalb des Elements authors zu verwenden:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ppl="http://dyomedea.com/ns/people" xmlns:lib="http://dyomedea.com/ns/library">
   <xs:import namespace="http://dyomedea.com/ns/people" schemaLocation="very-simple-2-ns-ppl.xsd"/>
   <xs:element name="library">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="book" type="lib:bookType"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
   <xs:complexType name="bookType">
      <xs:sequence>
         <xs:element name="title" type="xs:string"/>
         <xs:element name="authors">
            <xs:complexType>
               <xs:sequence>
                  <xs:element ref="ppl:person"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
   </xs:complexType>
</xs:schema>

Der zweite Ansatz nimmt den gleichen Import vor, definiert jedoch das Element authors so, daß es den Typ ppl:authorType hat, statt den komplexen Typ explizit selbst zu definieren. Dies ergibt ein kürzeres Schema:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:lib="http://dyomedea.com/ns/library" xmlns:ppl="http://dyomedea.com/ns/people" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:import namespace="http://dyomedea.com/ns/people" schemaLocation="very-simple-2-ns-ppl.xsd"/>
   <xs:element name="library">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="book" type="lib:bookType"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
   <xs:complexType name="bookType">
      <xs:sequence>
         <xs:element name="title" type="xs:string"/>
         <xs:element name="authors" type="ppl:authorType"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
   </xs:complexType>
</xs:schema>

Obwohl beide Schemas dieselben Instanzdokumente validieren, unterscheiden sich die beiden Entwürfe im Stil deutlich. Anwendungen, die sich für Informationen über das Dokument auf das Schema verlassen, werden es auf zwei sehr unterschiedliche Arten sehen. Der erste Ansatz liefert eine klarere Trennung zwischen den beiden Namensräumen. Die Verwendung des Verweises erlaubt es dem Element ppl:person, innerhalb des Elements authors aufzutreten, sie unternimmt jedoch keinerlei Schritte zur direkten Vermischung des Elements authors mit dem Namensraum "http://dyomedea.com/ns/people". Der zweite Ansatz ist kürzer, weist jedoch einen Datentyp aus einem Namensraum einem Element in einem anderen Namensraum zu.

Wenn Sie Ihre Schemas ausschließlich zur Validierung verwenden, ist diese Unterscheidung unwichtig. Beide Schemas validieren exakt dieselbe Menge von Dokumenten. Wenn Ihre Anwendungen sich jedoch für Typinformationen auf Ihre Schemas verlassen (indem sie das PSVI oder möglicherweise schemabasierte Datenbindung während der Kompilierung verwenden), kann die Verschiebung in der Perspektive bedeutsam werden. Wenn Sie den Datentyp-Ansatz wählen, bedeutet das, daß Ihre Anwendungen deutlich mehr von den Inhalten Ihres Schemas verstehen müssen. Außerdem werden neue Abhängigkeiten zwischen Ihrer Anwendung und den Einzelheiten der Verarbeitung von W3C XML Schema geschaffen.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML Schema bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML Schema" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de