Das erste Schema

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

Wir werden im Laufe dieses Buchs sehen, daß es viele verschiedene Schreibstile für Schemas gibt, und es gibt sogar noch mehr Ansätze dafür, ein Schema aus einem Instanzdokument abzuleiten. Für unser erstes Schema werden wir einen Stil übernehmen, der denjenigen, die schon mit DTDs gearbeitet haben, vertraut sein wird. Wir beginnen damit, eine klassifizierte Liste der Elemente und Attribute zusammenzustellen, die in dem Schema zu finden sind.

Die Elemente in unserem Instanzdokument heißen author, book, born, character, dead, isbn, library, name, qualification und title , während available, id und lang als Attribute auftreten.

Dieses erste Schema wird nun so konstruiert, daß wir der Reihe nach jedes Element unterhalb des Schema-Dokumentelements namens schema, das zum Namensraum W3C XML Schema ("http://www.w3.org/2001/XMLSchema") gehört und üblicherweise mit dem Präfix »xs« versehen wird, definieren.

Bevor wir beginnen, müssen wir die Elemente klassifizieren. Für diese Übung müssen wir einige Schlüsseldefinitionen angeben, um zu verstehen, wie W3C XML Schema diese Klassifikation vornimmt. (Sie werden diese Definitionen mit weiteren Einzelheiten auf den Seiten über einfache und komplexe Typen kennenlernen.)

Das Inhaltsmodell charakterisiert die Typen von Kindelementen und Textknoten, die in einem Element enthalten sein können (ohne auf die Attribute zu achten).

Da Inhaltsmodell heißt » leer«, wenn weder Kindelemente noch Textknoten erwartet werden, » einfach«, wenn nur Textknoten aufgenommen werden können, » komplex«, wenn nur Unterelemente erwartet werden, und » gemischt«, wenn sowohl Textknoten als auch Unterelemente vorhanden sein können. Zu beachten ist bei der Bestimmung des Inhaltsmodells, daß nur Elemente und Textknoten zählen, daß eventuell vorkommende Attribute, Kommentare und Verarbeitungsanweisungen ( Processing Instructions ) jedoch ignoriert werden. Beispielsweise hätte ein Element mit einigen Attributen, einem Kommentar und mehreren Verarbeitungsanweisungen ein »leeres« Inhaltsmodell, wenn es keine Text- oder Elementkinder hätte.

Elemente wie name, born und title haben einfache Inhaltsmodelle:

.../...
    
    <title lang="de">
       Auf den Hund gekommen
    </title>   
.../...

   <name>
      Charles M. Schulz
   </name>

   <born>
      1922-11-26
   </born>
.../...

Elemente wie library oder character haben komplexe Inhaltsmodelle:

<library>
    <book id="b3810518883" available="true">
             .../...
    </book>
</library>



<character id="Lucy">
    <name>
        Lucy
    </name>
    <born>
        1952-03-03
    </born>
    <qualification>
        herrschsüchtig, kratzbürstig und egoistisch
    </qualification>
</character>

Bei den Elementen mit einfachem Inhaltsmodell können wir zwischen denen mit Attribut und denen, die keine Attribute tragen können, unterscheiden. Spätere Kapitel werden darstellen, wie W3C XML Schema auch einfache und gemischte Inhaltsmodelle darstellen kann.

W3C XML Schema betrachtet diejenigen Elemente, die ein einfaches Inhaltsmodell und keine Attribute haben, als » einfache Typen«, während alle anderen Elemente (wie etwa einfacher Inhalt mit Attributen sowie andere Inhaltsmodelle) » komplexe Typen« sind. Anders ausgedrückt: Wenn ein Element nur Textknoten enthalten kann und keine Kindelemente oder Attribute akzeptiert, wird es als einfacher Typ angesehen; in allen anderen Fällen handelt es sich um einen komplexen Typ.

Attribute sind stets von einfachem Typ, weil sie keine Kinder haben und lediglich einen Textknoten enthalten können.

In unserem Beispiel haben Elemente wie author oder title einen komplexen Typ:

<author id="CMS">
    <name>
        Charles M. Schulz
    </name>    
    <born>    
       1922-11-26
    </born>
    <dead>
        2000-02-12
    </dead>
</author>

.../...


<title lang="de">
    Auf den Hund gekommen
</title>

Hingegen sind Elemente wie born oder qualification (und natürlich alle Attribute) von einfachem Typ:

<born>
  1922-11-26
</born>

.../...

<qualification>
     brachte die klassische Musik in die Peanuts-Comics ein
</qualification>

.../...

<book available="true"/>

Nachdem wir nun Kriterien zur Klassifizierung unserer Komponenten haben, können wir sie alle definieren. Fangen wir mit dem einfachsten an, indem wir ein Typelement wie etwa das Element name wählen, das innerhalb von author oder character auftreten kann:

<name>
  Charles M. Schulz
</name>

Um ein solches Element zu definieren, verwenden wir ein xs:element (globale Definition), das direkt unterhalb des Dokumentelements xs:schema gestellt wird:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="name" type="xs:string"/>

.../...

</xs:schema>

Der Wert, der zum Bezug auf den Datentyp (xs:string) verwendet wird, trägt das Präfix xs, also das mit W3C XML Schema verknüpfte Präfix. Das weist darauf hin, daß xs:string ein von W3C XML Schema vordefinierter Datentyp ist.

Das gleiche kann für alle anderen einfachen Typen wie auch für die Attribute gemacht werden:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="name" type="xs:string"/>
  <xs:element name="qualification" type="xs:string"/>
  <xs:element name="born" type="xs:date"/>
  <xs:element name="dead" type="xs:date"/>
  <xs:element name="isbn" type="xs:string"/>
  <xs:attribute name="id" type="xs:ID"/>
  <xs:attribute name="available" type="xs:boolean"/>
<xs:attribute name="lang" type="xs:language"/>

.../...

</xs:schema>

Auch wenn, wie gesagt, dieser Entwurfsstil DTD-Anwendern bekannt sein dürfte, müssen wir doch darauf hinweisen, daß er flacher als eine DTD ist, denn die Deklaration von Attributen findet außerhalb der Element-Deklarationen statt. Das führt zu einem Schema, in dem Elemente und Attribute ziemlich gleich behandelt werden. Wir werden jedoch sehen, daß dieser einfache flache Stil bei einem Schema zur Beschreibung eines XML-Vokabulars, das Namensräume verwendet, in den meisten Fällen nicht praktikabel ist.

Die Angleichung von Elementen einfachen Typs und Attributen stellt gegenüber den Datenmodellen von XPath, DOM und Infoset eine Vereinfachung dar. Diese betrachten ein Element einfachen Typs als Entität, das ein einziges Kind vom Typ »character« hat. Ein Attribut hingegen betrachten sie als Entität mit normalisiertem Wert. Der Nutzen dieser Vereinfachung liegt darin, daß wir einfache Datentypen dazu verwenden können, Elemente von einfachem Typ und Attribute unterschiedslos definieren und auf konsistente Weise schreiben zu können:

<xs:element name="isbn" type="xs:string"/>

oder

<xs:attribute name="isbn" type="xs:string"/>

Die Reihenfolge der Definitionen in einem Schema ist ohne Bedeutung. Wenden wir uns jetzt in Richtung mehr Typenkomplexität und definieren das Element title , das in dem Instanzdokument wie folgt auftritt:

<title lang="de">
    Auf den Hund gekommen
</title>

Da dieses Element ein Attribut trägt, ist es von komplexem Typ. Weil es nur einen Textknoten enthält, hat es einfachen Inhalt. Wir schreiben seine Definition daher wie folgt:

<xs:element name="title">
 <xs:complexType>
  <xs:simpleContent>
   <xs:extension base="xs:string">
    <xs:attribute ref="lang"/>
   </xs:extension>
  </xs:simpleContent>
 </xs:complexType>
</xs:element>

In der XML-Syntax sieht das ziemlich wortreich aus, aber es kann beinahe im Klartext gelesen werden: »Das Element namens title hat komplexen Typ, der einfachen Inhalt hat, der seinerseits durch Erweiterung des vordefinierten Datentyps xs:string entsteht, indem das in diesem Schema definierte Attribut mit dem Namen lang hinzugefügt wird.«

Die verbleibenden Elemente ( library , book , author und character ) sind alle von komplexem Typ mit komplexem Inhalt. Sie werden definiert, indem man die Folge von Elementen und die Attribute angibt, aus denen sie aufzubauen sind.

Das Element library , das einfachste dieser Elemente, wird definiert als:

<xs:element name="library">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="book" maxOccurs="unbounded"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

Diese Definition läßt sich so lesen: »Das Element namens library ist ein komplexer Typ, der aus einer Folge von 1 bis zu beliebig vielen Vorkommen (beachten Sie das Attribut maxOccurs ) Elementen besteht, die unter dem Namen book definiert sind«.

Das Element author , das ein Attribut trägt und für das wir das Sterbedatum als optional betrachten können, könnte so aussehen:

<xs:element name="author">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="name"/>
    <xs:element ref="born"/>
   <xs:element ref="dead" minOccurs="0"/>
   </xs:sequence>
  <xs:attribute ref="id"/>
 </xs:complexType>
</xs:element>

Das bedeutet, daß das Element namens author ein komplexer Typ ist, der aus einer Folge von drei Elementen ( name , born und dead ) und dem Attribut id besteht. Das Element dead ist optional – es darf auch nullmal auftreten.

Die Attribute minOccurs und maxOccurs , die wir in einigen der vorangegangenen Elemente gesehen haben, ermöglichen es festzulegen, wie häufig ein Element mindestens bzw. höchstens vorkommen darf. Der Standardwert ist in beiden Fällen 1, demnach muß, wenn beide Angaben fehlen, das betreffende Element genau einmal in der Folge auftreten. Der besondere Wert »unbounded« kann für maxOccurs verwendet werden, wenn die Anzahl von Vorkommen nach oben unbeschränkt ist.

Die Attribute müssen nach der Folge definiert werden. Die übrigen Elemente ( book und character ) können auf die gleiche Weise definiert werden, was uns zu dem folgenden vollständigen Schema bringt:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="name" type="xs:string"/>
    <xs:element name="qualification" type="xs:string"/>
    <xs:element name="born" type="xs:date"/>
    <xs:element name="dead" type="xs:date"/>
    <xs:element name="isbn" type="xs:string"/>
    <xs:attribute name="id" type="xs:ID"/>
    <xs:attribute name="available" type="xs:boolean"/>
    <xs:attribute name="lang" type="xs:language"/>
    <xs:element name="title">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute ref="lang"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="book" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="author">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="born"/>
                <xs:element ref="dead" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute ref="id"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="isbn"/>
                <xs:element ref="title"/>
                <xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute ref="id"/>
            <xs:attribute ref="available"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="character">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="born"/>
                <xs:element ref="qualification"/>
            </xs:sequence>
            <xs:attribute ref="id"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

   

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