In diesem Abschnitt werden typische Anwendungsfälle im Bereich der XML-Verarbeitung untersucht. Hierbei wird nach einer kurzen Beschreibung des Problems, jeweils eine Lösung für DOM (unter Verwendung von Xerces), beziehungsweise für JDOM angegeben. Am Ende dieser Seite finden sich Links für zwei vollständige Beispiele.
Bestehende XML-Dokumente lesen
Ein Dokument komplett neu erzeugen
Informationen extrahieren
Die Struktur des Dokuments verändern
Das Dokument speichern
Vollständige Beispiele
import
org.apache.xerces.parsers.DOMParser;
|
import org.jdom.input.SAXBuilder;
|
Eine Schwäche von DOM besteht darin, dass das Einlesen eines Dokuments nicht durch das W3C spezifiziert ist und damit implementierungsabhängig bleibt. Dadurch ist die Portabilität der Programme in gewisser Weise eingeschränkt, da ein Wechsel einer DOM-Implementierung nicht immer ohne Codeänderungen durchgeführt werden kann. Auch ansonsten wirkt das JDOM-Programmfragment deutlich natürlicher und intuitiver.
Möchte man kein bereits vorhandenes Dokument lesen, dann steht man vielleicht vor dem Problem ein Dokument von Grund auf neu zu erzeugen und mit Elementen, Attributen, etc. zu füllen. Die unten stehenden Programmfragmente erzeugen jeweils ein XML-Dokument, welches der folgenden Struktur entspricht.
<linux-config> |
import
org.apache.xerces.dom.DOMImplementationImpl;
|
import org.jdom.*;
|
Hier kann man sicherlich geteilter Meinung sein, ob die direkte Instanzierung von Objekten die gute Lesbarkeit der Quellen fördert. Ein bedeutenderer Unterschied, der hier sichtbar wird, ist die Behandlung des Textinhalts von Elementen. Während das DOM diesen Textinhalt als echte Kindknoten eines Elements betrachtet, behandelt JDOM diesen Text als Eigenschaft eines Elements. Dies wird im folgenden Abschnitt noch deutlicher.
Natürlich besteht eine der Hauptaufgaben im Umgang mit XML darin, die im Dokument enthaltenen Informationen zu extrahieren und weiterzuverwenden.
<league> |
Die Aufgabe der folgenden Programmfragmente besteht nun darin den Mannschaftsnamen, die Punkte und die Tordifferenz in geeigneten Variablen zu speichern. Hierzu nehmen wir ferner an, dass die Variable root das Wurzelelement des Dokuments (<league>) enthält.
import
org.w3c.dom.*;
|
import org.jdom.*;
|
Spätestens an dieser Stelle wird der Mehraufwand, der durch die Verwendung von DOM notwendig wird beachtlich. So gibt es zum Beispiel keine Möglichkeit eine Referenz auf das erste Kindelement eines Knotens mit gegebenem Namen zu erhalten, ohne zuvor eine Liste aller dieser Kindelemente zu erzeugen. Außerdem wirkt sich auch hier der Unterschied bei der Handhabung des Textinhalts von Elementen bei den beiden Werkzeugen zum Nachteil des DOM aus. Auch die Bereitstellung von einigen Bequemlichkeitsmethoden bei JDOM, gerade bei der Bearbeitung von Attributen, hilft dem Programmierer bei häufigen Aufgaben.
Zuweilen steht man vor der Aufgabe, dass die Struktur des Dokumentenbaums verändert werden muss. Neue Elemente werden eingefügt oder bestimmte Attribute entfernt. In den folgenden Programmfragmenten werden die Kindelemente eines bestimmten Elements nach einem bestimmten Kriterium sortiert.
<league> |
import
org.w3c.dom.*;
|
import java.util.*;
|
Dieses Beispiel zeigt ganz deutlich, wie sich die Verwendung der Standardkollektionen durch JDOM sehr positiv auf Kriterien wie Flexibilität, Performanz, Programmieraufwand, Sicherheit, Lesbarkeit, Motivation, etc. auswirkt.
Nach der Erzeugung oder Verarbeitung eines Dokuments, soll dieses wohl meist als XML-Dokument in einer bestimmten Datei gespeichert werden. Dies ermöglicht es in einer späteren Sitzung die Daten erneut einzulesen und zu bearbeiten.
import java.io.*;
|
import java.io.*;
|
Die Lösung des Problems ist in beiden Fällen unkompliziert und sehr ähnlich. Im übrigen gilt hier das gleiche wie für das Einlesen eines Dokuments: es ist unbedingt zu beachten, dass man sich bei der Verwendung von DOM auf eine bestimmte Implementierung (hier: Xerces) festlegen muss, um das Dokument zu Serialisieren, da das W3C in dieser Hinsicht keine Standardisierung vorgenommen hat.
An dieser Stelle folgen noch zwei eigene Programme im vollen Quelltext, aus denen die zuvor behandelten Problemfälle zum großen Teil entnommen sind. Da die Programme kommentiert sind, wird hier auf eine ausführliche Beschreibung verzichtet. Es ist wichtig, dass sich sowohl zum Kompilieren, als auch zur Laufzeit, die notwendigen Pakete im aktuellen Klassenpfad befinden.
Beschreibung:
Dieses Programm gibt für ein Theaterstück eine Liste der Szenen aus, in denen
eine bestimmte Figur auftritt.
Dieses ist ein Beispiel für eine Aufgabe, die sich auch mit SAX lösen lässt, da ein sequentieller, nur-lesender Zugriff auf die Daten ausreichend ist. Die Verwendung von SAX ist sowohl im Hinblick auf die Speicher-, als auch auf die Laufzeiteffizienz optimal, und sollte wann immer möglich erfolgen.
Beispielaufruf:
javac Theatre1.java
java Theatre1 rich_iii.xml GLOUCESTER
ACT I - SCENE I. London. A street.
ACT I - SCENE II. The same. Another street.
ACT I - SCENE III. The palace.
ACT II - SCENE I. London. The palace.
ACT II - SCENE II. The palace.
ACT III - SCENE I. London. A street.
ACT III - SCENE IV. The Tower of London.
ACT III - SCENE V. The Tower-walls.
ACT III - SCENE VII. Baynard's Castle.
Links:
Das Programm unter Verwendung von...
Beschreibung:
Dieses Programm liest entweder eine Liste von Mannschaften von der
Standardeingabe, oder einen existierenden Tabellenstand aus einem XML-Dokument
ein. Danach wird für jede Mannschaft ein Ergebnis eingelesen, um dann einen
neuen Tabellenstand zu berechnen.
Links:
Das Programm unter Verwendung von...