Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (2. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Java ist auch eine Insel (2. Auflage)
gp Kapitel 13 Die eXtensible Markup Language (XML)
  gp 13.1 Auszeichnungssprachen
  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 XML  downtop

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 mit Hilfe 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 XSLT  downtop

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 -->
<!-- Ausgabe von HTML Kopf und Fuss -->
   <xsl:template match="/">
      <html>
         <head>
            <title>Wir machen eine Party</title>
         </head>

         <body>
<!-- An dieser Stelle wird tiefer in den XPath-Baum -->
<!-- verzweigt. Die Ausgabe der anderen Templates   -->
<!-- wird an dieser Stelle eingefuegt               -->
            <xsl:apply-templates />
         </body>
      </html>
   </xsl:template>

<!-- Fuer das Element party der XML-Datei wird eine Ueberschrift -->
<!-- fuer die Ausgabe erzeugt. Das Attribut Datum wird in der   -->
<!-- Ueberschrift ausgegeben. -->
   <xsl:template match="party">
      <h1>Partytabelle fuer den
      <xsl:value-of select="@datum" />
      </h1>
      <xsl:apply-templates />
   </xsl:template>

<!-- Fuer jeden einzelnen Gast wird eine Begruessung ausgegeben -->
   <xsl:template match="gast">
      <p>
         <h2>Hallo
         <xsl:value-of select="@name" />
         </h2>
      </p>

      <xsl:apply-templates />
   </xsl:template>

<!-- Jedem Gast wird sein Lieblingsgetraenk angeboten. -->
   <xsl:template match="getraenk">
      <p>Hier ist ein
      <xsl:value-of select="." />

      fuer dich.</p>
   </xsl:template>
<!-- Hier wird eine bedingte Ausgabe erzeugt. Jeder Gast -->
<!-- zeigt seinen Zustand und sagt, ob er noch ledig ist. -->
   <xsl:template match="zustand">
      <xsl:if test="@nuechtern='true'">
         <h3>Ich bin noch nuechtern!</h3>
      </xsl:if>

      <xsl:if test="@ledig='true'">
         <h3>Ich bin noch zu haben!</h3>
      </xsl:if>

      <hr />
   </xsl:template>
</xsl:stylesheet>

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 JAXP  toptop

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 mit Hilfe 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 8. Zum Zeitpunkt des Drucks kann es sein, dass es bereits eine neuere Version von JDOM gibt. Hier wurde nur ein kleiner Überblick über die Funktionen von JDOM und die Verarbeitung von XML mit Java gegeben. Genauere Informationen finden sich auf der Webseite von JDOM (http://www.jdom.org/) und auf der Webseite von Sun (http://www.java.sun.com/xml/).





Copyright © Galileo Press GmbH 2003
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