Ausblick
Es ist schon fast an der Zeit, ein Resümee unserer Reise durch Java und XML zu ziehen. Ich hoffe, Sie hatten Spaß. Bevor ich Sie dem Grübeln über die vielen sich bietenden Möglichkeiten überlasse, möchte ich noch einen Blick in die Kristallkugel werfen. Wie jeder gute Programmierer versuche ich die Entwicklungsrichtungen neuer Technologien zu erahnen und ihnen einen Schritt voraus zu sein. Dafür braucht man gewöhnlich mehr als nur oberflächliche Informationen über eine ganze Anzahl von Technologien, damit man wieder in die Gänge kommt, wenn sich irgend etwas doch anders entwickelt.
In diesem Kapitel werde ich einige interessante Dinge anreißen, die momentan am Horizont auftauchen. Ich gebe bereitwillig zu, daß einige meiner Annahmen völlig danebenliegen können, andere wiederum könnten den nächsten Hype auslösen. Schauen Sie sich alles an, und seien Sie bereit, wenn irgend etwas davon in Ihre Anwendung paßt.1
XLink
Die erste Sache auf meiner Liste der hochinteressanten Neuheiten in der Welt von XML ist XLink. XLink definiert einen Verknüpfungsmechanismus zum Verweis auf andere Dokumente in XML (Verknüpfung engl. link). Für diejenigen unter Ihnen, die mit HTML vertraut sind, klingt das wahrscheinlich wie das Element »a«, an das Sie daher gewöhnt sind:
<a href="http://www.nickelcreek.com">Check out Nickel Creek!</a>.
XLink bietet jedoch weitaus mehr als unidirektionale (nur in eine Richtung verlaufende) Verknüpfungen. Mit XLink kann man bidirektionale Verknüpfungen anlegen und bestimmen, wie diese Verknüpfungen verarbeitet werden. Das Wichtigste jedoch ist, daß man Verknüpfungen von jedem XML-Element aus anlegen kann (nicht nur vom Element »a«). Aus all diesen Gründen lohnt es sich, darauf näher einzugehen.
Beispiel 16-1 ist ein kleines XML-Dokument, das einige meiner Gitarren repräsentiert.
<?xml version="1.0" encoding="ISO-8859-1"?> <guitars xmlns="http://www.newInstance.com/about/guitars" xmlns:xlink="http://www.w3.org/1999/xlink"> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href="http://www.newInstance.com/about/guitars/bourgeoisOM"> <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougOM_front_full.jpg" xlink:actuate="onLoad" xlink:show="embed"> Dies ist eine wirkliche Schönheit in einem kleinen Körper. Obwohl sie nur eine OM ist, benutze ich sie sowohl für Bluegrass als auch für »Finger-Style«-Sound. </description> </guitar> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href="http://www.newInstance.com/about/guitars/bourgeoisD150"> <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougd150_con_rim2.jpg" xlink:actuate="onLoad" xlink:show="embed"> Hier wird gerade der heilige Gral gefertigt. Dana Bourgeois baut gerade dieses Bluegrass-Monster aus brasilianischem Rosenholz und Adirondack. Du weißt, daß sie fertig ist, wenn Leute fliehen und deine Fenster splittern! </description> </guitar> </guitars>
Zunächst werden Sie bemerken, daß ich den XLink-Namensraum referenziere, damit das Dokument Zugriff auf die mit XLink verbundenen Attribute und Features hat. Zweitens benutze ich nur XLinks des einfachen Typs, wie sie von dem Attribut xlink:type definiert werden. Ich tue das, weil die Browser-Unterstützung für XLink minimal ist – ich habe sie nur in Mozilla und Netscape 6 gefunden (ich konnte IE 6.0 nicht testen, die Version 5.5 unterstützt es nicht). Daher werden hier nur die grundlegenden Konzepte beleuchtet.
Da jetzt alle Formalitäten erledigt sind, benötigt XLink nur noch einige Attribute an den Elementen, die Links haben. Nehmen Sie das Guitar-Element meines Dokuments als Beispiel. Hier wird ein »luthenier« (Lutenist) für jede Gitarre angegeben. (Das ist ein Gitarrenbauer – für all jene, die sich bislang nicht mit Gitarren befaßt haben.) Ich sprach bereits die Benutzung des Attributs xlink:type an, das auf den Wert »simple« (engl. einfach) gesetzt ist. Dann wird eine mittels XLink zu verknüpfende URL angegeben. Diese URL wird mit dem Attribut xlink:href spezifiziert. Bisher sieht das alles wie HTML aus. Nicht weiter schwierig, oder?
Der Voreinstellung folgend (Unterstützung im Browser immer vorausgesetzt), wird das einen Link produzieren, der den aktuellen Inhalt des Fensters ersetzt, wenn er angeklickt wird. Möchte man, daß die Verknüpfung in einem neuen Fenster angezeigt wird, benutzt man das Attribut xlink:show und gibt ihm den Wert »new« – die Voreinstellung »replace« (engl. ersetzen) ist das normale Verhalten von HTML.
Natürlich deckt das nur die grundlegende Verknüpfung ab. Es wird aber schon interessanter, wenn Sie entfernte Daten als Ressourcen benutzen möchten, zum Beispiel beim Einbinden von Bildern. Schauen Sie auf das Element description. Es setzt den Wert des Attributs xlink:show auf »embed« (engl. einbetten). Die Ressource – in diesem Fall ein Bild der beschriebenen Gitarre – soll in die angezeigte Seite eingebaut werden. Das weist einen XLink-fähigen Browser an, die beschriebene Ressource an dieser Stelle in das XML-Dokument einzufügen. Richtig interessant wird das, wenn Sie sich vorstellen, daß das auch ein anderes XML-Dokument sein kann und nicht nur ein simples Bild.
Das kann man auch noch einen Schritt weiter treiben und bestimmen, wann die Ressource angezeigt werden soll. Das wird durch das Attribut xlink:actuate erreicht. Es definiert, wann die Ressource gelesen und angezeigt wird. Hat das Attribut den Wert »onLoad«, wie in Beispiel 16-1, wird die Ressource geladen, wenn das ursprüngliche Dokument geladen wird. Man könnte statt dessen »onRequest« angeben, was bedeutet, daß die Ressource erst beim Anklicken geladen und angezeigt wird. Damit kann man die benötigte Bandbreite niedrig halten und dem Nutzer erlauben, nur die Ressourcen anzuschauen, die er wirklich sehen möchte.
XLink hat definitiv das Potential, die nächste Generation von XML-Dokumenten stark zu beeinflussen. Die vollständige Spezifikation ist unter http://www.w3.org/TR/xlink einzusehen. Ich würde die aktuellen Browser im Blick behalten, um zu sehen, wann vollständige XLink-Unterstützung verfügbar ist.
XPointer
XPointer ist eine weitere Verknüpfungstechnologie in XML – tatsächlich baut es auf den Fähigkeiten von XLink auf. XLink ist schon allein sehr nützlich, erlaubt es aber nur, auf andere Dokumente zu verweisen. Es lassen sich aber eine Menge an Szenarien ausdenken, bei denen man nur auf einen Teil des anderen Dokuments verweisen möchte. Das ist ein häufig benutzter Fall und ähnelt dem Mechanismus der benannten Anchors (engl. Anker) in HTML. Das wird möglich, indem man XPointer auf XLink aufsetzt; die Spezifikationen bauen sehr natürlich aufeinander auf und wurden mit Blick auf gute Zusammenarbeit entworfen.
Lassen Sie uns zunächst einen Blick auf das Zieldokument werfen, zu dem eine Verknüpfung erstellt werden soll. Stellen Sie wenn möglich sicher, daß id-Attribute darin benutzt werden. Das wird die Verknüpfungen wesentlich vereinfachen. Beispiel 16-2 zeigt eine Liste einiger Gitarren des Gitarrenbauers Dana Bourgeois und setzt eine ID für jeden Typ.
Um das Beispiel besser erläutern zu können, nehmen wir an, daß dieses Dokument unter http://www.bourgeoisguitars.com/guitars.xml zu finden ist. Anstatt das gesamte Dokument zu referenzieren, was uns nicht viel weiterhelfen würde, erlaubt es XPointer, spezifische Teile des Dokuments als Ziele für Verknüpfungen anzugeben. Erinnern Sie sich an das Attribut xlink:href?
Der Wert dieses Attributs war das Ziel eines XLinks. Sie können nun noch ein Hashzeichen (#) und einen XPointer-Ausdruck zu dieser URL hinzufügen. So bezieht sich der Ausdruck xpointer(id("slopeD")) auf ein Element mit der ID »slopeD« in einem Dokument. Um sich also auf das in Beispiel 16-2 gezeigte XML und darin auf das Slope-D-Gitarrenmodell zu beziehen, würde man die URL http://www.bourgeoisguitars.com/guitars.xml#xpointer(id( »slopeD«)) benutzen. Eigentlich einfach. Lassen Sie mich Ihnen nun eine modifizierte Version des XML-Dokuments aus dem XLink-Abschnitt (Beispiel 16-1) zeigen, die meine Gitarren mit einigen XPointer-Referenzen beschreibt. (Vergeben Sie mir die furchtbare Formatierung – Ich hatte ziemlich viel in manche Zeilen zu pressen.) Schauen Sie sich Beispiel 16-3 an:
<?xml version="1.0" encoding="ISO-8859-1"?> <guitarTypes xmlns="http://www.bourgeoisguitars.com"> <type model="OM" ID="OM"> <picture url="http://www.bourgeoisguitars.com/images/vvOM.jpg"/> <description>Orchester-Modell mit kleinem Körper.</description> </type> <type model="D" ID="D"> <picture url="http://www.bourgeoisguitars.com/images/ricky%20skaggs%20model.jpg"/> <description>Bluegrass-Kraftwerk - das Standard-Schlachtschiff.</description> </type> <type model="slopeD" ID="slopeD"> <picture url="http://www.bourgeoisguitars.com/images/slope%20d,%20custom%20version.jpg"/> <description> Schlachtschiff mit schrägen Schultern, perfekt für Gesangsbegleitung. </description> </type> </guitarTypes>
<?xml version="1.0" encoding="ISO-8859-1"?> <guitars xmlns="http://www.newInstance.com/about/guitars" xmlns:xlink="http://www.w3.org/1999/xlink"> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href= "http://www.bourgeoisguitars.com/guitars.xml#xpointer(id('OM'))"> <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougOM_front_full.jpg" xlink:actuate="onLoad" xlink:show="embed"> Dies ist eine wirkliche Schönheit in einem kleinen Körper. Obwohl sie nur eine OM ist, benutze ich sie sowohl für Bluegrass als auch für »Finger-Style«-Sound. </description> </guitar> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href= "http://www.bourgeoisguitars.com/guitars.xml#xpointer(id('D'))"> <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougd150_con_rim2.jpg" xlink:actuate="onLoad" xlink:show="embed"> Hier wird gerade der heilige Gral gefertigt. Dana Bourgeois baut gerade dieses Bluegrass-Monster aus brasilianischem Rosenholz und Adirondack. Du weißt, daß sie fertig ist, wenn Leute fliehen und deine Fenster splittern! </description> </guitar> </guitars>
Nun kann mein XML-Dokument die XML-Informationen referenzieren, die Dana Bourgeois über seine Gitarren zur Verfügung stellt. Ändert er seine Informationen, muß ich mich nicht darum kümmern – da ich ja nur Verknüpfungen dazu verwalte, bleibt mein Dokument aktuell. Beachten Sie, daß die Anführungszeichen im XPointer-Ausdruck unter Benutzung von & statt eines Kaufmanns-Unds (&) gequotet werden müssen. Das sorgt für eine ziemlich lange URL.
Lange URLs sind meiner Erfahrung nach oft die Ursache für langweilige Tippfehler (und für die schlechte Formatierung in einem Buch!). Glücklicherweise bietet XPointer eine nette Abkürzung, wenn man auf ein Element verweisen möchte, das ein ID-Tag besitzt. Statt des Ausdrucks xpointer(id("D")) kann man auch einfach den Wert des ID-Tags des Ziels benutzen – in diesem Fall also »D«. Damit kann ich das Dokument aus Beispiel 16-3 in das in Beispiel 16-4 gezeigte ändern. Dadurch erhält man eine sehr viel klarere Syntax der Verknüpfungen.
<?xml version="1.0" encoding="ISO-8859-1"?> <guitars xmlns="http://www.newInstance.com/about/guitars" xmlns:xlink="http://www.w3.org/1999/xlink"> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href="http://www.bourgeoisguitars.com/guitars.xml#OM" > <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougOM_front_full.jpg" xlink:actuate="onLoad" xlink:show="embed"> Dies ist eine wirkliche Schönheit in einem kleinen Körper. Obwohl sie nur eine OM ist, benutze ich sie sowohl für Bluegrass als auch für »Finger-Style«-Sound. </description> </guitar> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href="http://www.bourgeoisguitars.com/guitars.xml#D" > <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougd150_con_rim2.jpg" xlink:actuate="onLoad" xlink:show="embed"> Hier wird gerade der heilige Gral gefertigt. Dana Bourgeois baut gerade dieses Bluegrass-Monster aus brasilianischem Rosenholz und Adirondack. Du weißt, daß sie fertig ist, wenn Leute fliehen und deine Fenster splittern! </description> </guitar> </guitars>
Zusätzlich zu diesem direkten Vorgehen kann man auch auf Elemente relativ zu anderen Elementen verweisen. Als Beispiel dazu habe ich meine description-Elemente in Beispiel 16-5 geändert, um auf das Bild in der Datei bourgeois.xml aus Beispiel 16-2 zu verweisen.
Um diese lange URL in das Platzangebot eines O’Reilly-Buches pressen zu können, habe ich die URL www.bourgeoisguitars.com einfach als http://bg.com abgekürzt. Das ist zwar keine gültige URL, damit läßt sich aber wenigstens das Beispiel verstehen.
<?xml version="1.0" encoding="ISO-8859-1"?> <guitars xmlns="http://www.newInstance.com/about/guitars" xmlns:xlink="http://www.w3.org/1999/xlink"> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href= "http://bg.com/guitars.xml#xpointer(id('OM'))/descendant::picture[@url]"> <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougOM_front_full.jpg" xlink:actuate="onLoad" xlink:show="embed"> Dies ist eine wirkliche Schönheit in einem kleinen Körper. Obwohl sie nur eine OM ist, benutze ich sie sowohl für Bluegrass als auch für »Finger-Style«-Sound. </description> </guitar> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href= "http://bg.com/guitars.xml#xpointer(id('D'))/descendant::picture[@url]" > <descripton xlink:type="simple" xlink:href="http://www.newinstance.com/pics/bougd150_con_rim2.jpg" xlink:actuate="onLoad" xlink:show="embed"> Hier wird gerade der heilige Gral gefertigt. Dana Bourgeois baut gerade dieses Bluegrass-Monster aus brasilianischem Rosenholz und Adirondack. Du weißt, daß sie fertig ist, wenn Leute fliehen und deine Fenster splittern! </description> </guitar> </guitars>
Hier können Sie sehen, daß gleichzeitig mit dem über die ID gefundenen Element der Abkömmling dieses Elements mit Namen »picture« gefunden wird (angegeben über das Schlüsselwort descendant – engl. Abkömmling). Dann ist der Wert des Attributs »url« dieses Elements das eigentliche Ziel der Verknüpfung. Ich weiß, das ist ein wenig viel, aber wenn Sie es Schritt für Schritt nachvollziehen, sollte es eigentlich klar werden. Für mehr Informationen über die Vielzahl an Möglichkeiten, die XPointer bietet, sollten Sie sich die XPointer-Spezifikation online unter http://www.w3.org/TR/xptr anschauen.
Beachten Sie, daß ich nicht die Kurzform der ID-Links benutzt habe, über die ich im letzten Abschnitt sprach. Das rührt daher, daß diese Kurzform nur bei direkten Verknüpfungen erlaubt ist – weitere Verknüpfungen (wie zum Beispiel die Referenz über die Traversierung der Kinder in Listing 4) sind nur über die längere Form erlaubt.
XLink und XPointer werden die Art, wie XML-Dokumente verknüpft und verfaßt werden, grundlegend ändern. Ich erwarte breite Unterstützung dafür in Java-APIs, wenn die Spezifikationen von Browsern ebenfalls voll unterstützt werden, also halten Sie die Augen offen!
XML Schema-Binding
Bewegt man sich mehr in Richtung Java, ist ein wichtiger Aspekt der XML-Programmierung, den ich erwarte, eine Menge von Datentypen in Java, die XML Schema-Konstrukte repräsentieren. Das würde den DOM Level 2-HTML-Bindings ähneln, über die ich bereits im Kapitel DOM für Fortgeschrittene gesprochen habe. Ich würde das unendlich viel nützlicher finden. Da ein XML Schema selbst ein XML-Dokument ist, kann es geparst und auch ansonsten behandelt werden wie alle anderen XML-Dokumente. Jedoch wird es schmerzhaft, wenn man versucht, mit einem XML Schema umzugehen, wie mit ganz normalen XML-Dokumenten.
Sie können zum Beispiel nicht einfach eine Element-Definition abfragen und herausfinden, ob es ein komplexer Typ ist. Statt dessen müssen Sie das Element holen, seine Kinder bestimmen, herausfinden, ob eines dieser Kinder complexType heißt, und so weiter. Das wird noch schlimmer, wenn Dinge wie das Sequencing benutzt werden – plötzlich erscheint die Definition eines komplexen Typs zwei Ebenen tief verschachtelt.
Was ich erwarte (und in der Tat schon rumoren höre) sind eine Grammatik und eine Menge von Java-Objekten, die speziell dafür entwickelt werden, zu XML Schema-Datentypen zu passen. Das wird wahrscheinlich auf einer bestehenden objektorientierten API wie DOM oder JDOM aufbauen. Lassen Sie uns also für ein Beispiel annehmen, daß DOM Level 4 oder JDOM 1.1 solche Objekte definieren. Sie könnten dann solchem Code begegnen:
// DIESER CODE IST VÖLLIG HYPOTHETISCH XSDDocumentParser schemaParser = new org.apache.xerces.parsers.XSDParser( ); parser.parse(mySchema); XSDDocument doc = parser.getXSDDocument( );
Statt nun mit root-Elementen und Attributen in XML zu arbeiten, würden Sie dieses Dokument (in dem alle Klassen XSD (für XML Schema Datatypes) vorangestellt haben), wie hier gezeigt, mittels Schema-Konzepten bearbeiten:
// Holen des "root"-Elements XSDSchema schema = doc.getXSDSchema( ); // Holen des Target-Namensraums für dieses Dokument String targetNamespaceURI = schema.getTargetNamespace().getURI( ); // Holen einiger benannter Element-Definitionen XSDElementDef def = schema.getElementDef("movie"); if (def.isComplexType( )) { List attributeDefs = def.getAttributeDefs( ); List nestedElementDefs = def.getElementDefs( ); } else { XSDType elementType = def.getType( ); }
Offensichtlich ist das ein wenig gestellt, da ich hier die Syntax erfunden habe. Jedoch ist klar, daß mein Code auf einem XML Schema funktionieren würde und Vorteile aus der Schema-Semantik zieht. Ich arbeite nicht mit einfachen XML-Semantiken (obwohl man auch in diesem Medium arbeiten könnte, wenn diese Klassen von grundlegenden DOM- oder JDOM-Klassen abgeleitet wären), sondern benutze, was die XML Schema-Spezifikation über gültige Schemas sagt, um das Ganze ein bißchen intelligenter zu machen. Hoffentlich wird die dritte Auflage dieses Buches Informationen zu dieser API beinhalten, denn sie wäre wirklich sehr nützlich.
Und der Rest . . .
Es gibt noch eine Menge Sachen mehr, von denen ich etwas sehen möchte oder zu denen ich etwas sagen könnte. Jedoch würde das die Fertigstellung dieses Buches nochmals um sechs Monate verzögern, und dann wäre es an der Zeit für eine erneute Überarbeitung. Statt dessen werde ich Ihnen eine knappe Auflistung von Stichwörtern präsentieren. Diese Informationsfragmente können hilfreich für Sie sein oder Sie langweilen, aber das, worum es dabei geht, wird in den nächsten Jahren fast sicher großen Einfluß auf Java und XML haben:
- Scalable Vector Graphics (SVG) und Apache Batik (http://xml.apache.org)
- MathML (die Mathematik Markup Language, eine Erweiterung von XML)
- Spezifikationen bezüglich ebXML (http://www.ebXML.org) und darauf aufbauend
- Xerces 2.0 (http://xml.apache.org)
- JAXM, die Java-API für XML-Messaging (http://java.sun.com/xml/xml_jaxm.html)
- JAXRPC, die Java API für XML-basiertes RPC (http://java.sun.com/xml/xml_ jaxrpc.html)
So, das sind sie – meine Schnellschüsse für das, was in einem Jahr (oder auch früher) wichtig sein wird. Ich werde wahrscheinlich einige davon in der nächsten Auflage widerrufen, aber so ist das Leben auf der Überholspur – und XML ist definitiv die Überholspur.
Und was kommt jetzt?
Anhänge. Der Index. Dann ein paar Informationen über mich und ein Kolophon. Und wahrscheinlich ein wenig Werbung für andere großartige Bücher von O’Reilly.
Ernsthaft – bis zu diesem Punkt habe ich eine Menge Informationen zusammengefaßt. Wenn Sie sich jetzt ein paar Tage Zeit nehmen, um das Material auf sich wirken zu lassen, und anschließend Ihre neuen XML-Kenntnisse an einem Projekt auf der Arbeit oder im Privaten ausprobieren, werden Sie Ihre XML-Fähigkeiten noch aufpolieren. Bald werden Sie ein XML-Wizard sein und Ihre Anwendungen werden an Wert gewinnen, weil sie flexibler, konfigurierbarer und produktiver sind. Schließlich werden Sie bemerken, wie Ihr Wert für ihren Chef (und vielleicht für die Chefs anderer Unternehmen) dramatisch steigt, während Sie leicht zu wartende und performante Anwendungen schreiben. Viel Spaß – Ich sehe Sie online.
- 1)
- Viele der Abschnitte in diesem Kapitel basieren vollständig oder in Teilen auf Artikeln und Tips, die ich für die IBM Developer Works Online-Publikation unter http://www.ibm.com/developer geschrieben habe. Danke an Nancy Dunn und die netten Leute bei IBM, die mir erlaubten, Teile dieser Artikel zu aktualisieren und hier zu verwenden.