13.5 JAXP als Java-Schnittstelle zu XML
Nutzen Anwender einen XML-Parser, dann wird in der Regel ein Parser-Objekt konstruiert und die Methoden verwendet, damit der Parser seiner Arbeit nachgeht. Der Nachteil bei der direkten Nutzung ist die Abhängigkeit von bestimmten Klassen. Sun hat daher eine API mit dem Namen Java API for XML Parsing (JAXP) entworfen, sodass Entwickler zwischen verschiedenen XML-Parsern wählen können, ohne den eigentlichen Code zu verändern. Das ist das gleiche Prinzip wie bei den Datenbanktreibern. Mit JAXP können XML-Dokumente mit SAX 2.0 und DOM Level 2 bearbeitet und mit XSLT transformiert werden. Das Paket ist in Java 2 SDK 1.4 integriert. Für ältere Umgebungen kann es kostenlos von http://java.sun.com/xml/ bezogen werden. Eine Dokumentation findet der Leser unter http://java.sun.com/webservices/docs/ea1/tutorial/index.html. Die Dokumentation zu JAXP ist in »The Java Web Services Tutorial« integriert worden.
Um JAXP zu verwenden, sind zunächst einige Import-Anweisungen nötig. Dazu gehören zunächst einmal:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilder;
Die Ausnahmen stammen von org.xml.sax und org.w3c.dom:
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
Jetzt kann ein Parser-Objekt mithilfe einer Fabrik-Methode erzeugt werden.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse( new File("Datei") );
Die Parser sind selbstständig bei DocumentBuilderFactory angemeldet, und newInstance() liefert eine Unterklasse vom DocumentBuilder.
JDOM und JAXP ergänzen sich auch gegenseitig. Eine JDOM-Datenstruktur kann mit einem XSLT-Parser aus JAXP in ein anderes Dokument umgewandelt werden.
13.5.1 Einführung in XSLT
XSLT ist eine XML-Applikation, mit der XML-Dateien in andere textbasierte Dateien umgewandelt werden können. Die Eingabedatei muss immer eine XML-Datei sein. Die Ausgabedatei kann ein beliebiges Format haben. Die XSLT-Datei, in der Umwandlungsregeln festgelegt werden, muss eine XML-Datei sein. Das bedeutet insbesondere, dass HTML-Tags in der XSLT-Datei die Regeln für XML-Elemente erfüllen müssen.
In der XSLT-Datei werden die Elemente der XML-Quelldatei durch Templates ausgewählt und die Formatierung der Ausgabe beschrieben. Es ist möglich, die Formatierung von Bedingungen abhängig zu machen, Elemente in der Ausgabe auszublenden und die Reihenfolge der Ausgabe festzulegen.
Die Auswahl der Elemente wird durch XPath-Ausdrücke beschrieben. XPath ist eine XML-Applikation, in der eine XML-Datei als Baumstruktur abgebildet wird. Durch eine Notation, die an die Baumstruktur von Verzeichnisbäumen angelehnt ist, können einzelne Elemente oder ganze Unterbäume ausgewählt werden.
Für unser Beispiel ist hier eine einfache XSLT-Datei angegeben, die eine XML- Ausgabe aus der Datei party.xml erzeugt. Dabei wird in dem ersten Template ein HTML-Rumpf erzeugt, in den die Ausgabe der anderen Templates eingebettet wird. Mit dem Element party wird eine Überschrift für die Ausgabedatei erzeugt. Das Element <gast> wird in einem Template benutzt, um für jeden Gast eine persönliche Anrede zu erzeugen. Jedem Gast wird sein Lieblingsgetränk serviert. Zum Schluss beschreibt noch jeder kurz, wie es ihm geht und ob er noch ledig ist.
Hier ist die XSLT-Datei für die Umwandlung:
Listing 13.4 party.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl=">http://www.w3.org/1999/XSL/Transform">
<!-- Match auf das Root Element des XPath Baum
Wir machen eine Party
Partytabelle fuer den
Hallo
Hier ist ein
fuer dich.
Ich bin noch nuechtern!
Ich bin noch zu haben!
-->
Das Ergebnis der Umwandlung ist folgende HTML-Datei:
<html>
<head>
<title>Wir machen eine Party</title>
</head>
<body>
<h1>Partytabelle fuer den 31.12.01</h1>
<p><h2>Hallo Albert Angsthase</h2></p>
<p>Hier ist ein Wein fuer dich.</p>
<p>Hier ist ein Bier fuer dich.</p>
<h3>Ich bin noch zu haben!</h3>
<hr>
<p><h2>Hallo Martina Mutig</h2></p>
<p>Hier ist ein Apfelsaft fuer dich.</p>
<h3>Ich bin noch nuechtern!</h3>
<h3>Ich bin noch zu haben!</h3>
<hr>
<p><h2>Hallo Zacharias Zottelig</h2></p>
</body>
</html>
Die Ausgabe des Parsers ist nicht so schön formatiert, aber das ist für die Ausgabe in HTML nicht relevant. Diese Datei wurde nachträglich formatiert, damit die Ausgabe besser lesbar ist. Die Verarbeitung von Umlauten mit XSLT ist immer noch ein Problem. Trotz der Definition des Zeichensatzes im Kopf der XSLT-Datei bereiten Umlaute dem XSL-Parser noch Probleme.
13.5.2 Umwandlung von XML-Dateien mit JDOM und JAXP
Damit die Umwandlung mit JDOM möglich ist, wird das JDOM-Dokument von einem Wrapper-Objekt aufgenommen und mit dem XSLT-Parser Xalan von JAXP umgewandelt. Das Ergebnis ist wieder in einem Wrapper-Objekt und kann in eine JDOM-Datenstruktur umgewandelt werden.
Hier werden die beiden Ummantelungsklassen erzeugt. Das JDOM-Dokument ist von dem Objekt JDOMSource umgeben. Die Ausgabe wird in dem Objekt JDOMResult gekapselt:
JDOMSource XSLDoku = new JDOMSource( doc );
JDOMResult HTMLDoku = new JDOMResult();
Mit einer Fabrik-Methode wird ein Objekt der Klasse Transformer erzeugt. Dies ist ein Objekt aus dem JAXP-Paket und übernimmt die Umwandlung von XML-Dateien mithilfe einer XSLT-Datei. Für die Ein- und Ausgabe können Streams, SAX-Eigenschaften oder eine DOM-Datenstruktur verwendet werden. In diesem Beispiel wird die Datei als Stream an den Transformer übergeben.
Transformer transformer =
TransformerFactory.newInstance().newTransformer(
new StreamSource("party.xsl") );
Mit dem Objekt Transformer und den beiden Objekten JDOMSource und JDOMResult wird die Umwandlung durchgeführt. Das Ergebnis der Umwandlung steht in dem Objekt JDOMResult und kann mit der Methode getDocument() in eine JDOM-Datenstruktur umgewandelt werden. Hier wird die JDOM-Datenstruktur erzeugt und direkt auf der Konsole ausgegeben:
XMLOutputter xmlOut = new XMLOutputter();
xmlOut.output( HTMLDoku.getDocument(), System.out );
Dieses Beispiel zeigt das Zusammenspiel von JDOM und JAXP. Damit wird deutlich, dass JDOM kein Ersatz für JAXP ist, sondern eine komfortable Möglichkeit darstellt, XML-Dateien mit einer Java-Datenstruktur zu verarbeiten. Dabei können Elemente aus JAXP, die nicht in JDOM implementiert sind, genutzt werden, ohne auf die Vorteile von JDOM zu verzichten. Diese Beschreibung bezieht sich auf JDOM in der Version Beta 9. Zum Zeitpunkt des Drucks dieses Buches kann es sein, dass es bereits eine neuere Version von JDOM gibt. Hier wird nur ein kleiner Überblick über die Funktionen von JDOM und die Verarbeitung von XML mit Java gegeben. Genauere Informationen finden sich auf der Web-Seite von JDOM (http://www.jdom.org/) und auf der Web-Seite von Sun (http://www.java.sun.com/xml/).
|