Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 13 Die eXtensible Markup Language (XML)
gp 13.1 Auszeichnungssprachen
gp 13.1.1 Die Standard Generalized Markup Language (SGML)
gp 13.1.2 Extensible Markup Language (XML)
gp 13.2 Eigenschaften von XML-Dokumenten
gp 13.2.1 Elemente und Attribute
gp 13.2.2 Beschreibungssprache für den Aufbau von XML-Dokumenten
gp 13.2.3 Schema - eine Alternative zu DTD
gp 13.2.4 Namensraum (Namespace)
gp 13.2.5 XML-Applikationen
gp 13.3 Die Java-APIs für XML
gp 13.3.1 Das Document Object Model (DOM)
gp 13.3.2 Simple API for XML Parsing (SAX)
gp 13.3.3 Java Document Object Model (JDOM)
gp 13.4 XML-Dateien mit JDOM verarbeiten
gp 13.4.1 JDOM beziehen
gp 13.4.2 Paketübersicht
gp 13.4.3 Die Document-Klasse
gp 13.4.4 Eingaben aus der Datei lesen
gp 13.4.5 Das Dokument als XML-Datei ausgeben
gp 13.4.6 Der Dokumenttyp
gp 13.4.7 Elemente
gp 13.4.8 Zugriff auf Elementinhalte
gp 13.4.9 Liste mit Unterelementen erzeugen
gp 13.4.10 Neue Elemente einfügen und ändern
gp 13.4.11 Attributinhalte lesen und ändern
gp 13.5 JAXP als Java-Schnittstelle zu XML
gp 13.5.1 Einführung in XSLT
gp 13.5.2 Umwandlung von XML-Dateien mit JDOM und JAXP
gp 13.6 Serielle Verarbeitung von XML mit SAX
gp 13.6.1 Ausgabe der Datei party.xml mit SAX


Galileo Computing

13.5 JAXP als Java-Schnittstelle zu XMLdowntop

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.


Galileo Computing

13.5.1 Einführung in XSLTdowntop

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.


Galileo Computing

13.5.2 Umwandlung von XML-Dateien mit JDOM und JAXPtoptop

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/).





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de