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.6 Serielle Verarbeitung von XML mit SAXdowntop

Die Verarbeitung von XML-Dateien mit SAX ist eine schnelle und speicherschonende Methode. Die XML-Datei wird seriell gelesen, und für jeden Bestandteil der XML-Datei wird eine spezielle Methode aufgerufen. Der Nachteil ist, dass immer nur ein kleiner Bestandteil einer XML-Datei betrachtet wird und nicht die gesamte Struktur zur Verfügung steht.


Galileo Computing

13.6.1 Ausgabe der Datei party.xml mit SAXtoptop

Die Ereignisse, die bei der Verarbeitung mit SAX anfallen, sind in verschiedenen Schnittstellen festgelegt. Die wichtigste Schnittstelle ist org.xml.sax.ContentHandler. In dieser Schnittstelle werden die wichtigsten Methoden für die Verarbeitung festgelegt.

Um die Arbeit zu erleichtern, gibt es eine Klasse org.xml.sax.helpers. DefaultHandler. Diese Klasse liefert eine leere Implementierung für alle Methoden der Schnittstelle org.xml.sax.ContentHandler. Zusätzlich werden noch die Schnittstellen DTDHandler, EntityResolver und ErrorHandler implementiert. Auf diese Schnittstellen wird hier nicht näher eingegangen. Eine genaue Beschreibung ist in dem JAXP-Tutorial von Sun (http://java.sun.com/webservices/docs/ea1/tutorial/doc/JAXPIntro.html) zu finden.

Den SAX-Parser erzeugen

Im Folgenden wird das Parsen der XML-Datei party.xml vorgestellt. Dazu werden die Methoden der Schnittstelle ContentHandler implementiert, um die Inhalte der Datei party.xml auf der Konsole auszugeben.

public class SAXParty extends DefaultHandler

Die Klasse SAXParty erweitert die Klasse DefaultHandler. Dadurch stehen leere Implementierungen für die Methoden, die vom Parser beim Verarbeiten der XML-Daten aufgerufen werden, zur Verfügung. Es müssen jetzt nur noch die benötigten Methoden überschrieben werden.

SAXParserFactory factory = SAXParserFactory.newInstance();

Durch diese statische Methode wird ein Objekt der Klasse SAXParserFactory erzeugt. Diese Klasse liefert eine Instanz der Klasse SAXParser.

SAXParser saxParser = factory.newSAXParser();

Dieser ermöglicht das Parsen der XML-Datei. Es fehlt nur noch eine sinnvolle Implementierung der Methoden der Schnittstelle ContentHandler, um die einzelnen Bestandteile der XML-Datei zu verarbeiten.

Die wichtigsten Methoden der Schnittstelle ContentHandler

Die Schnittstelle ContentHandler legt Methoden für die Verarbeitung des XML-Inhalts fest. Hier werden exemplarisch die wichtigsten Methoden vorgestellt.

Zuerst wird der Beginn des Dokuments dokumentiert.

public void startDocument() throws SAXException
{
    System.out.println( "Start des Dokuments" );
}

Sobald das erste Element erreicht wird, ruft der Parser die folgende Methode auf:

public void startElement( String namespaceURI, String localName,
  String qName, Attributes atts ) throws SAXException
{
    System.out.println( "Start eines Elements" );
        
    // Namensraumadresse ausgeben
    System.out.println( "namespaceURI: " + namespaceURI );
        
    // lokalen Namen ausgeben
    System.out.println( "localName: " + localName );
        
    // qualifizierenden Namen ausgeben
    System.out.println( "qName: " + qName );
        
    // Attribute ausgeben
    for ( int i = 0; i < atts.getLength(); i++ )
        System.out.println( "Attribut Nr. " + i + ": " +
          atts.getQName( i ) + " = " + atts.getValue( i ) );
}

Diese Methode gibt alle notwendigen Informationen eines Elements aus. Falls kein spezieller Namensraum vergeben ist, sind die Strings namespaceURI und localName leer. Der String qName ist immer gefüllt. Für die Attribute gibt es das Objekt Attributes.

Der Inhalt eines Elements wird durch die folgende Methode ausgegeben:

public void characters( char ch[], int start, int length )
{
    System.out.println( "Start von characters" );
    // Ausgabe der Zeichenkette
    System.out.println( "Zeichenkette: " );
    for ( int i = start; i < (start + length); i++ )
      System.out.print( "." + ch[i] );
    System.out.println();
}

Es ist nicht festgelegt, ob der Parser den Text an einem Stück liefert oder in kleinen Stücken. Die Punkte in der Ausgabe sollen darstellen, wie diese Methode arbeitet.

Das schließende Tag eines Elements wird durch die folgende Methode verarbeitet:

public void endElement( String namespaceURI, String localName, String qName )
{
    System.out.println( "Ende eines Elements" );
    
    // Namensraumadresse ausgeben
    System.out.println( "namespaceURI: " + namespaceURI );
    
    // lokalen Namen ausgeben
    System.out.println( "localName: " + localName );
        
    // qualifizierenden Namen ausgeben
    System.out.println( "qName: " + qName );
}

Bis auf die Attribute sind auch bei dem schließenden Tag alle Informationen für die Identifizierung des Elements vorhanden. Auch hier sind die Strings namespaceURI und localName leer, falls kein spezieller Namensraum verwendet wird.

Auch für das Ende der Datei wird eine spezielle Methode aufgerufen:

public void endDocument()
{
    System.out.println( "Ende des Dokuments" );
}




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