XML - Grundlagen, Prinzipien und Anwendungen

Aufgabe 3 (XML Informationsmodelle)

DOM-Zugriff auf XML

Abgabe bis 9.5.2006


Hinweis: Falls ihr Fragen zur Übung habt, könnt ihr euch während der Übungsstunden an Pascal Kurtansky wenden.

Ziel dieser Aufgabe ist es, die Kenntnisse in den Bereichen Document Object Model (DOM), XML Information Set (Infoset) und XML Namespaces zu vertiefen. DOM repräsentiert ein XML Dokument als Hierarchie von Knoten auf die mittels eines API zugegriffen werden kann. Damit können XML-Dokumente beispielsweise in Java mit Hilfe eines XML Parsers eingelesen und über die zur Verfügung stehende Programmierschnittstelle verändert werden. Das XML Infoset ist ein weiterer Ansatz, um XML-Dokumente zu repräsentieren, allerdings in einer Weise, die nicht mit DOM kompatibel ist. Das Infoset legt dabei den Fokus auf die im Dokument enthaltene Information. Die XML Namespaces schliesslich ermöglichen es, auf einfache Weise in einem Dokument Elemente (und Attribute) aus verschiedenen Quellen zu verwenden, ohne dabei einen Namenskonflikt zu verursachen.

Aufgabe Tips

1.

Im ersten Teil der Aufgabe soll das in Aufgabe 1 erstellte Dokument mit XML Namespaces erweitert werden. Wer Aufgabe 1 nicht gemacht hat, kann auf deren Musterlösung zurückgreifen. Auf eine Anpassung der dazugehörigen DTD wird diesmal verzichtet, da dies zu aufwändig wäre. Als Mindestanforderungen gelten dabei, dass

  • mindestes drei verschiedene Namespaces in drei verschiedenen Elementen definiert werden und
  • wenigstens fünf verschiedene Elemente und/oder Attribute zusammen alle diese Namespaces verwenden.

Altenativ zum Skript könnt ihr euch über XML Namespaces auch bei folgenden zwei Quellen erkundigen:

  • XML Namespace : Dies ist eine Kurzfassung, welche anhand von kleinen Beispielen das Konzept der XML Namespaces erklärt.
  • XML Namespaces FAQ: Hier findet ihr eine ausführliche Liste von FAQ, sehr empfehlenswert und hilfreich zum Lösen dieser Übung.

 

2. Das in Teilaufgabe 1 veränderte Dokument soll nun mit einem XML Parser in Java eingelesen werden. Mit Hilfe des DOM API soll eine Funktion geschrieben werden, welche - auf ein beliebiges Element angewendet - die in-scope Namespaces dieses Elements wiedergeben. Dabei handelt es sich um eine Liste von Namespaces, die in diesem Element gültig sind, d.h. welche im aktuellen oder einem der darüberliegenden Elemente deklariert wurden. Die genaue Definition ist der Beschreibung des XML Infosets zu entnehmen. Die resultierende Liste soll in einer lesbaren Form (z.B. als String) ausgegeben werden. DOM stellt eine Programmierschnittstelle zur Verfügung, über welche mittels entsprechender Methoden wie z.B. getElementsByTagName oder getNamespaceURI auf die in einem XML Dokument enthaltene Information zugegriffen werden kann. DOM repräsentiert das Dokument als Baumstruktur. Dies im Gegensatz zu SAX (Simple API for XML), welches ein Dokument eventgesteuert abarbeitet. XML Namespaces werden erst seit DOM Level 2 unterstützt, das aber heute weitgehend Standard in allen Implementierungen ist.
Das XML Infoset ist eine weitere Art die Information eines Dokumentes zu repräsentieren. Diese ist allerdings noch relativ neu und wird daher noch kaum unterstützt.
Als Anleitung zu DOM kann beispielsweise Understanding DOM verwendet werden.
3. Im dritten Schritt der Aufgabe geht es darum, das XML Dokument mit Hilfe des DOM API zu editieren. Es soll eine Methode in Java geschrieben werden, welche jedes Element im Dokument mit Attributen zugehöriger in-scope Namespaces erweitert. Dabei kann die Funktion aus Teilaufgabe 2 wiederverwendet werden. Zum Schluss soll das editierte XML Dokument serialisiert (als String) ausgegeben werden. Das DOM definiert auch Methoden wie beispielsweise setNodeValue oder createElement, welche es ermöglichen Elemente oder Attribute zu editieren oder gar neu hinzuzufügen. Die in Teilaufgabe 2 entwickelte Funktion kann verwendet werden, um eine Menge von neuen Attributen zu kreieren, welche an das entsprechende Element angehängt werden können. Diese Methode soll dann beginnend beim Wurzelknoten rekursiv über alle Elemente aufgerufen werden.

Die Abgabe der Übung besteht darin, das in Teilaufgabe 1 erweiterte XML Dokument, sowie den in den Teilaufgaben 2 und 3 erstellten Java Quellcode und das in Teilaufgabe 3 ausgegebene XML Dokument an den Assi zu mailen. Wiederum am besten Abgabe Übung 3 Link verwenden.


Schritt 1 (Einfügen von Namespaces in das XML Dokument)

Die Erweiterung des XML Dokumentes wird am besten schrittweise vorgenommen. Sinnvoll ist es beispielsweise, zunächst einen default Namespace im Document Element des Dokumentes zu deklarieren. Das kann eine erfundene URI (http://www.mydomain.com/mynamespace) oder die URI der DTD sein. Da zur Validierung des Dokumentes nach jeder Änderung die DTD ebenfalls erweitert werden müsste, wird auf diesen Schritt verzichtet. Die DOCTYPE Anweisung sollte deshalb aus dem XML Dokument entfernt, und das Dokument als standalone definiert werden. Anschliessend kann ein weiterer Namespace erfunden werden, der z.B. (im Falle des Beispiels von Aufgabe 2) ein Anbieter einer Musikdatenbank (z.B. dem all music guide) definiert haben könnte, um eine leichte Standardisierung der Dokumente zu erreichen. Die entsprechende Deklaration könnte in diesem Fall xmlns:allmusic="http://www.allmusic.com/namespace" lauten und Elemente oder Attribute wie allmusic:track etc. beinhalten. Danach können noch weitere Namespaces angefügt werden, z.B. auch solche die wirklich existieren wie der XHTML Namespace (http://www.w3.org/1999/xhtml) der in diesem Dokument als default Namespace verwendet wurde.


Schritt 2 (Namespace Analyse im XML Dokument mit DOM)

Um den Einstieg in diese Teilaufgabe zu erleichtern, wurde ein Template in Java erstellt, welches verwendet werden soll. Es beinhaltet bereits das Parsen des XML Dokumentes und gibt Error Messages für die Exceptions aus, die beim Parsen auftreten können. Man kann damit also direkt auf das Document Element des Dokumentes und das DOM API zugreifen, ohne sich um den Rest kümmern zu müssen. Da auf der Tardis kein CLASSPATH gesetzt ist, muss dieser für die verwendeten XML APIs explizit gesetzt werden:

setenv CLASSPATH /usr/pack/xerces_j-2.0.1-to/xerces-2_0_1/xmlParserAPIs.jar:/usr/pack/xerces_j-2.0.1-to/xerces-2_0_1/xercesImpl.jar:.

Anschliessend kann das Java-Programm erfolgreich compiliert werden:

javac DomTemplate.java

Das compilierte Programm kann dann wie folgt gestartet werden:

java DomTemplate deinDokument.xml

Wer sich mit dieser Umgebung vertraut gemacht hat (Java Kenntnisse werden vorausgesetzt), kann beginnen die Methode getInScopeNamespaces() zu implementieren. Die in-scope Namespaces des aktuellen Elementes setzen sich irgendwie zusammen aus den in-scope Namespaces des Vaterelementes und der im Element definierten Namespaces, d.h. am einfachsten wird es sein die Methode rekursiv aufzurufen mit einem geeigneten Abbruchmechanismus. Alternativ können natürlich auch die Methoden aus der DOM Level 2 Traversal and Range Specification verwendet werden, welche ebenfalls im DOM API zur Verfügung stehen.


Schritt 3 (Editierung des XML Dokumentes mit DOM)

Im letzten Schritt geht es darum, eine weitere Funktion setAllNamespaces() zu implementieren, welche in allen Elementen die in-scope Namespaces explizit ergänzt. Dabei können sicher einige Code-Fragmente aus der Methode getInScopeNamespaces() übernommen, bzw. kann diese sogar aufgerufen werden (bei rekursivem Aufruf allerdings sehr ineffizient!). Das so veränderte Dokument soll zum Schluss ausgegeben werden.


please send comments to xml-vl@dret.net
last modification on Wednesday, 26-Apr-2006 05:56:32 PDT
valid CSS!valid XHTML 1.0!