13.6 Serielle Verarbeitung von XML mit SAX
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.
13.6.1 Ausgabe der Datei party.xml mit SAX
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" );
}
|