Lade Inhalt...

XML-Schema - Eine Einführung in die Schemasprache für XML-Dokumente

Fachbuch 2007 27 Seiten

Informatik - Software

Leseprobe

Inhaltsverzeichnis

1. Was ist XML-Schema?

2. Aufbau und Referenzierung eines XML-Schemas

3. Einfache Elemente
3.1 Einleitung
3.2 Vordefinierte Datentypen
3.3 Eigene einfache Datentypen ableiten

4. Komplexe Elemente
4.1 Einleitung
4.2 Reine Textelemente
4.3 Reine Elemente
4.4 Kombinationselemente
4.5 Leere Elemente
4.6 Ableitungen von eigenen Datentypen

5. Attribute

6. Lokale und globale Deklarationen und Typdefinitionen

7. Namensräume

8. Kommentare

9. Aufteilung auf mehrere Schema-Dateien

10. Schlussbemerkung

1. Was ist XML-Schema?

XML hat sich als das Austauschformat zwischen verschiedenen Anwendungen und Plattformen etabliert. Als Auszeichnungssprache ist XML für die strukturierte Organisation von Daten gedacht.

Ein XML-Dokument muss zunächst wohlgeformt sein, um überhaupt verarbeitet werden zu können. Das bedeutet, dass es ein Wurzelelement enthält, alle Elemente korrekt ineinander geschachtelt sind und Elemente aus einem öffnenden und einem schließenden Tag bestehen. Letzteres wird bei leeren Elementen auch durch die Kurzschreibweise <element/> erreicht.

Neben diesem formalen Aufbau muss aber auch die innere Struktur des XML-Dokumentes den Erwartungen der verarbeitenden Applikation entsprechen. Ein Programm, das zum Beispiel in XML-Form eingehende Buchungen eines Reisebüros verarbeitet, erwartet in der XML-Struktur bestimmte Elemente. Dies könnten z.B. vorgangsnummer, veranstalter, reise datum, hoteladresse, kundennummer usw sein. Wenn diese Daten nicht an der erwarteten Stelle oder im falschen Format geliefert werden, ist eine Verarbeitung nicht möglich. Das Programm muss sich also darauf verlassen können, dass es die Daten in genau der Form bekommt, wie dies zur Verarbeitung notwendig ist.

Prinzipiell können in einem XML-Dokument die Bezeichnungen für Elemente und Attribute frei vergeben werden. Auch der strukturelle Aufbau, also wie die einzelnen Elemente geschachtelt werden, ist beliebig, sofern die Regeln für wohlgeformtes XML beachtet werden.

Um nun XML-Dokumente für den Datenaustausch zu verwenden, muss man den Aufbau für alle Beteiligten verbindlich festlegen. Dazu gibt es Schemasprachen, die Struktur und Inhalt des XML-Dokumentes definieren. Der erste Ansatz hierfür waren Document Typ Definitions (DTD). Diese sind selber kein XML, sondern verwenden eine eigene Syntax. DTDs sind nicht so komplex wie XML-Schemata, daher aber auch längst nicht so leistungsfähig.

Ein Vorteil von XML-Schema gegenüber DTDs ist, dass man den zulässigen Inhalt von Elementen sehr detailliert vorgeben kann. Dazu kann man sogar eigene Datentypen entwickeln. Zudem sind in einer DTD alle Elemente global deklariert, während ein XML-Schema genaue Angaben über die Schachtelung der Elemente zulässt.

Man bezeichnet ein XML-Dokument als gültig, wenn es neben der formalen Korrektheit einen Verweis auf eine DTD oder ein XML-Schema enthält und die dort festgelegten Vorgaben einhält. Die Spezifikation für XML-Schema liegt in der Verantwortung des W3C-Konsortiums und ist unter folgenden Links zu erreichen:

http://www.w3.org/TR/xmlschema-0

http://www.w3.org/TR/xmlschema-1

http://www.w3.org/TR/xmlschema-2

2. Aufbau und Referenzierung eines XML-Schemas

Anders als bei einer DTD kann man ein XML-Schema nicht innerhalb der XML-Datei definieren, in der es zur Anwendung kommt. Statt dessen wird das Schema in einer separaten Datei abgelegt, die üblicherweise die Endung xsd trägt. In dem XML-Dokument, das validiert werden soll, kann dann ein Verweis auf dieses Schema gesetzt werden.

Eine andere Möglichkeit ist, dass ein Schemaprozessor ein bestimmtes XML-Schema für ein Instanzdokument kennt bzw. man ihm dieses vorgeben kann, so dass eine Validierung unabhängig von einem Schemaverweis im Instanzdokument vorgenommen werden kann.

Zunächst betrachten wir das Grundgerüst eines XML-Schemas, das selbst ein XML-Dokument ist. Daher muss es allen Regeln der XML-Syntax genügen. Abb. 2.1 zeigt ein einfaches Beispiel.

Das XML-Schema beginnt mit der üblichen Prozessoranweisung <?xml version=“1.0“ ?>, die die obligatorische Versionsnummer und gegebenenfalls noch die Angabe eines Zeichensatzes enthält. Danach kommt das Wurzelelement, das über xmlns einen Verweis auf den Namensraum für XML-Schema deklariert. Mit diesem Verweis wird sozusagen auf das „Schema für Schemata“ verwiesen. Das erstellte XML-Schema kann damit selbst validiert werden. Um die Elemente des Namensraums zu kennzeichnen, wird in Abb. 2.1 und in allen folgenden Beispielen der Präfix xsd benutzt. Dies ist aber eine beliebige Festlegung, auch xs als Präfix ist häufig zu finden.

Es ist auch möglich, das Schema im Default-Namensraum zu erstellen und somit ganz auf einen Präfix zu verzichten. Dies wirft jedoch Probleme bei der Referenzierung selbst definierter Datentypen auf. Später wird erläutert, was darunter zu verstehen ist. Hier dient dies nur als Hinweis und Empfehlung, immer einen Präfix für den Namensraum von XML-Schema zu deklarieren.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 2.1: flug.xsd

Allen Bestandteilen des Namensraums von XML-Schema (element, complexType, sequence usw.) muss dann der gewählte Präfix vorangestellt werden. Auf die einzelnen Bestandteile wird in den folgenden Kapiteln näher eingegangen, hier soll es zunächst um den generellen Aufbau gehen.

Das Schema kann zur Validierung konkreter XML-Dokument herangezogen werden. Diese Dokumente, die als Instanzdokumente bezeichnet werden, müssen dem Regelwerk des XML-Schemas entsprechen, um gültig zu sein. Abb. 2.2 zeigt die Einbindung eines XML-Schemas in ein Instanzdokument.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 2.2: Ausschnitt aus xml-Datei

Im Wurzelelement flug wird der Namensraum für die Schemainstanz eingebunden, in der Regel mit dem Präfix xsi. Dadurch steht das Attribut noNamespaceSchemaLocation aus diesem Namensraum zur Verfügung, das als Wert einen relativen oder absoluten Pfad zur Schemadatei aufnimmt. Neben der Angabe eines Pfades zum benutzten XML-Schema innerhalb des Instanzdokumentes kann der Schemaprozessor auch auf anderem Wege das zu verwendende Schema erlangen.

Die im Schema deklarierten Elemente können bzw. – bei Pflichtelementen – müssen im Instanzdokument verwendet werden. Eine Validierung durch einen Schemaprozessor erzeugt einen Fehler, sobald das Instanzdokument von den Schemavorgaben abweicht.

In diesem einfachen Fall besitzt das XML-Schema keinen Zielnamensraum. Dieser müsste dort im Schema mit dem Attribut targetNamespace im Wurzelelement xsd:schema angegeben werden. Im Instanzdokument werden die Elemente aus dem Schema daher unqualifiziert, also ohne Präfix verwendet. Die Benutzung von Namensräumen in XML und in Zusammenhang mit XML-Schema ist ein komplexes Thema, auf das in Kapitel 7 noch näher eingegangen wird.

3. Einfache Elemente

3.1 Einleitung

Ein einfaches Element kann lediglich Textinhalt aufnehmen. Es darf weder Kindelemente noch Attribute enthalten. Für solche Fälle und bei Elementen ganz ohne Inhalt müssen komplexe Datentypen benutzt werden, auf die in Kapitel 4 eingegangen wird.

XML-Schema stellt eine Vielzahl von vordefinierten, einfachen Datentypen bereit. Man unterscheidet die atomaren, also nicht weiter teilbaren Typen sowie Listen- und Vereinigungstypen. Daneben kann man aber auch eigene Datentypen erstellen. In Abb. 3.1 wird gezeigt, wie einfache Elemente deklariert werden.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.1: Ausschnitt aus xsd-Datei

Für jedes Element muss eine Deklaration mit xsd:element erfolgen. Mit name und type werden der Elementname und sein Datentyp festgelegt. Mit xsd:string kann ein Element als Inhalt eine beliebige Zeichenkette enthalten. Mit xsd:positiveInteger umfasst der Wertebereich die positiven Ganzzahlen (1, 2, 3 usw.). Soll ein Element die Werte true oder false aufnehmen können, so steht der Typ xsd:boolean zur Verfügung. In Abb. 3.2 sieht man jeweils ein Beispiel in einem Instanzdokument für jedes oben deklarierte Element.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.2: Ausschnitt aus xml-Datei

3.2 Vordefinierte Datentypen

Der Basistyp aller einfachen und komplexen Datentypen ist xsd:anyType. Er kann beliebigen Inhalt aufnehmen. In Tab. 3.1 ist als Übersicht eine Auflistung wichtiger vordefinierter Datentypen dargestellt. Die Gesamtheit aller Datentypen findet sich in Teil 2 der Spezifikation für XML-Schema unter:

http://www.w3.org/TR/xmlschema-2

Abbildung in dieser Leseprobe nicht enthalten

Tab. 3.1

Es soll nun auf einige dieser und anderer Datentypen etwas detaillierter eingegangen werden. Fangen wir mit den Zahlenformaten an. Mit xsd:integer werden negative und positive Ganzzahlen erfasst. Möchte man den Wertebereich auf positive Ganzzahlen beschränken, so gibt es den Datentyp xsd:positiveIntege r, der die Zahlen 1, 2, 3 usw. umfasst. Mit xsd:nonNegativeInteger wird auch die 0 eingeschlossen (0, 1, 2, 3 usw.). In umgekehrter Richtung gibt es xsd:negativeInteger (-1, -2, -3 usw.) und xsd:nonPositiveInteger (0, -1, -2, -3 usw.).

In Abb. 3.1 haben wir schon ein Beispiel für xsd:positiveInteger gesehen. Für das Element einwohnerzahl wurde dieser Typ verwendet, da negative Werte und der Wert 0 hier keinen Sinn machen. Nun kommen wir zu den Zeit- und Datumstypen. In Abb. 3.3 finden sich einige Beispiele.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.3: Ausschnitt aus xsd-Datei

Mit xsd:date werden Inhalte beschrieben, die ein Datum in der Form YYYY-MM-DD darstellen, etwa 2007-09-21 oder 1999-12-12. Der Datentyp xsd:time erwartet eine Uhrzeit im Format hh:mm:ss.sss. Elemente, die den Typ xsd:duration verwenden, nehmen eine Zeitdauer auf.

Das Format sieht folgendermaßen aus: PnYnMnDTnHnMnS. Das P (P für Periode) ist stets anzugeben, die anderen Elemente (Y für Jahr, M für Monat, D für Tag) bis zum T sind optional und können entfallen, wenn n den Wert 0 besitzt. Mit dem T (T für Time) beginnt der Zeitabschnitt. Wenn keine Zeitangabe gemacht wird, dann muss das T entfallen. Ansonsten folgen H für Stunde, M für Minute und S für Sekunde. Auch diese Bestandteile sind jeweils optional. Der Wert von n muss immer eine Ganzzahl sein, lediglich die Sekundenangabe kann als Dezimalzahl dargestellt werden. Wird vor den gesamten Ausdruck ein Minuszeichen gestellt, so drückt dies eine negative, also rückwärts gerichtete Zeitdauer aus. In Abb. 3.4 folgt jeweils ein Beispiel für jeden der obigen drei Datentypen.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.4: Ausschnitt aus xml-Datei

Es gibt weitere Datentypen für Zeit- und Datumsangaben, etwa xsd:timeInstant, xsd:month, xsd:year oder xsd:recurringDate, auf die wir hier aber nicht weiter eingehen.

3.3 Eigene einfache Datentypen ableiten

Die von XML-Schema vordefinierten Datentypen können für eigene Erfordernisse angepasst werden. Somit hat man genaue Kontrolle darüber, welchen Inhalt Elemente oder Attribute enthalten dürfen. Man kann neue Datentypen definieren, deren Inhalte zum Beispiel durch Wertelisten, Minimalwerte, Maximalwerte oder Muster in Form regulärer Ausdrücke einschränkt werden. Dazu wird ein bestehender Datentyp als Basis genommen und mit xsd:restriction einer Einschränkung unterworfen. Die Art der Einschränkung wird als Facette (engl. facet) bezeichnet.

Der neue Datentyp umfasst daher eine Teilmenge des Wertebereichs, den der Basistyp abdeckt. Auch Erweiterungen in Form von Listen und Vereinigungsmengen sind möglich. Zunächst schauen wir uns das generelle Prinzip der Ableitung eigener Typen an. Abb. 3.5 zeigt einen selbst definierten Datentyp auf der Basis von xsd:string, der als gültige Inhalte nur die Begriffe barzahlung oder bankeinzug erlaubt.

Die Definition des neuen Typs zahlweise steht innerhalb des Start- und Ende-Tags von xsd:element. Bei dem neuen Typ handelt es sich um ein Element mit einfachem Inhaltsmodell, denn das Element darf nur Textinhalt, nicht aber Attribute oder Kindelemente besitzen. Dies wird durch xsd:simpleTyp ausgedrückt.

Als Ausgangsbasis wird in xsd:restriction der vordefinierte Datentyp xsd:string benutzt, also eine Zeichenkette. In diesem Beispiel ist die verwendete Facette xsd:pattern. In ihr wird durch einen regulären Ausdruck ein Muster festgelegt, das die Zeichenfolge erfüllen muss, um als Inhalt für das Element gültig zu sein.

Hier konkret darf barzahlung oder bankeinzug als Wert benutzt werden. Mit der Syntax wort1|wort2 wird nämlich eine ODER-Verknüpfung zwischen zwei Zeichenfolgen beschrieben.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.5: Ausschnitt aus xsd-Datei

Mit XML-Schema kann man für Zeichensequenzen komplexe Muster mit regulären Ausdrücken festlegen. Darauf gehen wir gleich noch weiter ein – hier ging es ja darum, den generellen Aufbau eines abgeleiteten Datentyps darzustellen. Damit ist die Definition unseres eigenen Typs auch schon fertig. In Abb. 3.6 sehen wir die beiden gültigen Inhalte, die das Element aufnehmen kann.

Abbildung in dieser Leseprobe nicht enthalten

Abb 3.6: Ausschnitt aus xml-Datei

Der von uns angelegte Datentyp in Abb. 3.5 wird als anonymer Typ bezeichnet, da er innerhalb von xsd:element definiert wurde. So gilt er nur für genau dieses eine Element, nämlich zahlweise. Man kann Typdefinitionen auch auf globaler Ebene anlegen und dann über eine Referenzierung für mehrere Elemente verwenden.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.7: Ausschnitt aus xsd-Datei

In einem solchen Fall steht xsd:simpleType für sich alleine, auf einer Ebene mit globalen Element-Deklarationen und unmittelbar unterhalb von xsd:schema. Das name -Attribut hat hier eine andere Bedeutung als zuvor. Es beschreibt den Namen eines Datentyps und nicht den Name eines Elementes wie in Abb. 3.5!

Der so definierte Datentyp kommt erst zur Anwendung, wenn Elemente in ihrer Deklaration diesen Datentyp anwenden. Man sieht in Abb. 3.7, dass die Elemente zahlweiseKunde und zahlweiseMitarbeiter den hier definierten Typ zahlweise benutzen. In Abb. 3.8 ist die Verwendung beider Elemente in einem XML-Dokument dargestellt. Dabei ist zu beachten, dass es sich bei dem Beispiel um den Ausschnitt aus einem größeren Instanzdokument handelt. Keineswegs können die beiden Elemente auf oberster Ebene zusammen auftreten, da es nur ein Wurzelelement geben kann.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.8: Ausschnitt aus xml-Datei

Wir kommen nochmal auf selbst erzeugte Datentypen zurück, die als Basis xsd:string verwenden. Eine andere Möglichkeit der Einschränkung ist die Angabe einer Minimal- oder Maximallänge. In Abb. 3.9 wird eine Zeichenkette auf mindestens sechs und höchstens zehn Zeichen eingegrenzt. Dies könnte zum Beispiel für ein Passwort oder eine Benutzerkennung gelten.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.9: Ausschnitt aus xsd-Datei

Im folgenden wird die Gesamtlänge des Inhaltes von artikelbezeichnung auf genau 30 Zeichen festgelegt. Kürzere oder längere Zeichenketten wären dann als Wert für das Element ungültig.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.10: Ausschnitt aus xsd-Datei

Wie bereits zu Beginn dieses Kapitels angedeutet, kann man einer Zeichenkette auf Basis von xsd:string durch Muster in Form regulärer Ausdrücke vielfältige Regeln auferlegen. Dazu ein Beispiel in Abb. 3.11.

Abbildung in dieser Leseprobe nicht enthalten

Abb. 3.11: Ausschnitt aus xsd-Datei

[...]

Details

Seiten
27
Jahr
2007
ISBN (eBook)
9783638907392
Dateigröße
569 KB
Sprache
Deutsch
Katalognummer
v85419
Schlagworte
XML-Schema Eine Einführung Schemasprache XML-Dokumente

Autor

Teilen

Zurück

Titel: XML-Schema - Eine Einführung in die Schemasprache für XML-Dokumente