Mittwoch, 3. Oktober 2007 |
Kolumne
Türsteher sind Menschen, die andere Menschen, welche nicht dem
Schema entsprechen, daran hindern, ein Gebäude zu betreten,
damit diese anderen Menschen in dem Gebäude nicht Dinge
anstellen können, die nicht gewollt sind. XML Schemas sind
XML-Dokumente, die andere XML-Dokumente, welche nicht dem (XML) Schema
entsprechen, daran hindern, eine Anwendung zu betreten, damit diese
anderen Dokumente in der Anwendung nicht Dinge anstellen
können, die nicht gewollt sind. XML Schemas sind also die
Türsteher Ihrer Anwendungen!
Rein oder raus
Die Analogie geht weiter. Wie auch bei den Discos, Bars und angesagten
Clubs gibt es verschiedene Schlangen vor den Türstehern: die
lange Schlange für das gemeine Tanzvolk, der Expressweg
für die High Society und die Hintertür für
jene, die Geld haben, aber keine Aufmerksamkeit wollen. Die Zuordnung
(durch den "Sorter") erfolgt dabei über
den Namen oder das Aussehen.
Da wären wir
wieder, beim Namen und folglich
auch bei den Namensräumen. Namensräume sind
für einen XML-Parser das, was das Aussehen für den
Sorter ist. Je nach Aussehen, pardon, Namensraum, validiert der
XML-Parser das Dokument gegen ein anderes XML Schema.
Und hier endet die Analogie. Denn ein XML-Dokument besitzt eben nicht
nur einen Namensraum, sondern es besteht aus XML-Elementen und
Attributen, die gegebenenfalls aus verschiedenen Namensräumen
stammen. Tatsächlich entscheidet also der XML-Parser von
Element zu Element und von Attribut zu Attribut, welches Schema er
anwendet.
Logik versus Physik
Damit er weiß, welches Schema das Richtige ist, besitzt jedes
Schema einen Zielnamensraum. Im Attribut
targetNamespace
nennt das
schema-Element
aus der XML-Schema-Datei diesen Zielnamensraum. Damit ist die logische
Zuordnung getan.
Doch woher kennt der XML-Parser die passende XML-Schema-Datei? Die
verarbeitende Anwendung muss dem XML-Parser vorab mitteilen, wo dieser
welche XML-Schema-Datei findet. Der XML-Parser erstellt aus diesen
Informationen eine Schema-Sammlung, die einem gegebenen Namensraum
den Speicherort einer XML-Schema-Datei zuordnet.
Sofern die Anwendung nur jene Dokumente verarbeitet, deren Format sie
im Voraus kennt, funktioniert diese Vorgehensweise. Sie scheitert
jedoch bei Anwendungen, die die Daten dynamisch verarbeiten, indem
sie beispielsweise je nach Format ein passendes Verarbeitungsmodul
laden (mehr hierzu in vierzehn Tagen, wenn es um den dritten
Anwendungszweck von Namensräumen, die Erweiterbarkeit, geht).
Richtig und falsch
Für diesen Anwendungsfall gibt es zwei Lösungen: eine
richtige und eine falsche. Die falsche Lösung heißt
Inline-Schemas und ist eine dumme Idee. Sie lautet: Packe das Schema
für eine XML-Datei in die XML-Datei. Wie so oft bei einfachen
Lösungen gilt: Sie funktioniert nicht. Denn die Frage lautet:
Wohin packe ich das XML Schema genau?
Ein XML-Dokument darf genau ein Wurzelelement haben. Somit ist an der
Spitze kein Platz mehr für das
schema-Element.
Es
kann sich nur innerhalb der XML-Daten befinden, die es validieren soll.
Das gleicht dem Bild einer Schlange, die sich selbst in den Schwanz
beißt. Das Schema muss sich selbst deklarieren. Oder
– auch das ist eine Möglichkeit, aber eben keine
saubere Lösung – das Wurzelelement ist selbst nicht
Teil des Formats beziehungsweise des Namensraums.
Richtig kompliziert wird es, wenn mehrere Namensräume und
damit Schemas im Spiel sind. Und weil auch das W3C das eingesehen hat,
kam es nie zu einer Spezifikation, die dieses Vorgehen standardisiert
und damit legitimiert hätte. Das hindert natürlich
die IT-Größen wie Microsoft nicht daran, derartiges
zu verwenden, selbstverständlich nicht durchgängig,
sodass in einem Fall, sprich in einer Anwendung,
Inline-Schemas funktionieren, in einer anderen dagegen nicht.
Namensraum plus Schema
Die richtige Lösung heißt
schemaLocation
und
ist ein Attribut aus dem Namensraum XML Schema Instance. XML Schema
Instance ist eine Spezifikation des W3C und wird folglich auch von den
meisten validierenden XML-Parsern unterstützt. Die Anwendung
des
schemaLocation-Attributs
ist einfach:
<root xmlns="urn:my-namespace" xmlns:ext="urn:your-namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:my-namespace myschema.xsd urn:your-namespace
yourschema.xsd">
Es enthält jeweils Paare von Namensraum-URIs und Schema-URIs,
wobei die Schema-URIs das zum Namensraum zugehörige Schema
lokalisieren. Ein Leerzeichen trennt sowohl den Namensraum-URI von dem
Schema-URI als auch die Paare voneinander.
Plädoyer für Türsteher
Die Verwendung von Namensräumen ist wichtig, weil sie die
Anwendung von XML Schemas ermöglicht. XML Schemas sind wichtig,
weil sie Ihre Anwendungen vor bösen Überraschungen absichern.
Fehler passieren, es ist nur die Frage wann und wo sie entdeckt werden
beziehungsweise auftreten: ob erst nach dutzenden Benutzeraktionen,
nachdem ein Dokument geladen wurde, und in den Tiefen des
Programmcodes, oder direkt beim Öffnen des Dokuments und an
zentraler Stelle im Programm. Letzteres spart Ihre Zeit und die Nerven
Ihrer Kunden und wird erst durch die Verwendung von Schemas
möglich.
Martin Szugat beschäftigt sich seit beinahe zehn Jahren mit
XML. Für ihn ist XML eine Schlüsseltechnologie und
XML Schema ist das Schloss, um die XML-Anwendungen abzusichern. Bei
Fragen, Anregungen und Kritik erreichen Sie den Autor per E-Mail an
martin.szugat@techworker.net.