Sonntag, 12. Februar 2012


Kolumne

Mittwoch, 3. Oktober 2007 | Kolumne

Naked XML: Türsteher

(Link zum Artikel: http://www.entwickler.de/jaxenter/kolumnen/038494)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Martin Szugat

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.

Kommentare

Folgende Links könnten Sie auch interessieren