PlanetXML

XML in Java mit dem SAX-Parser

Ein einfaches Beispiel wie man XML-Dateien mit dem SAX-Parser einliest.

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

/**
 * Minimales Beispiel für die Verwendung des SAX-Parsers in Java. Die XML Datei wird
 * eingelesen und ordentlich formatiert auf der Konsole ausgegeben.
 * DefaultHandler ist eine abstrakte Klasse, die die Interfaces ContentHandler,
 * DTDHandler, EntityResolver und ErrorHandler implementiert.
 */
public class Main extends DefaultHandler
{
    /**
     * Verschachtelungstiefe der Tags, wird verwendet, um das XML-Dokument
     * formatiert auszugeben. 
     */
    private int level = 0;

    /**
     * Leerer Konstruktor, die Initialisierung des Parsers erfolgt in der
     * main-Methode.
     */
    public Main()
    {
    }

    /**
     * Gibt <code>level</code> Tabs auf der Konsole aus.
     */
    public void indent()
    {
        // Mit Tabs einrücken
        for (int i=0;i<level;i++)
            System.out.print("\t");
    }

    /**
     * Wird am Anfang des Dokuments aufgerufen, definiert im Interface ContentHandler.
     */
    public void startDocument() throws SAXException
    {
        //System.out.println("Start des Dokuments");
    }

    /**
     * Wird bei jedem öffnenden Tag aufgerufen, definiert im Interface ContentHandler.
     * Bei leeren Tags wie zum Beispiel &lt;img /&gt; wird startElement und
     * endElement direkt hintereinander aufgerufen. Mit J2SE 1.4.2 scheint nur
     * qName gefüllt zu sein.
     *
     * @param namespaceURI URI des Namespaces für dieses Element, kann auch ein leerer String sein.
     * @param localName Lokaler Name des Elements, kann auch ein leerer String sein.
     * @param qName Qualifizierter Name (mit Namespace-Prefix) des Elements.
     * @param atts Liste der Attribute.
     */
    public void startElement(String namespaceURI, String localName,
            String qName, Attributes atts) throws SAXException
    {
        indent();

        System.out.print("<" + qName);

        // Test-Code um zu sehen, was in namespaceURI und localName steht
        // System.out.print(" " + namespaceURI);
        // System.out.print(" " + localName);

        // Attribute ausgeben
        for( int i = 0; i < atts.getLength(); i++ )
            System.out.print(" " + atts.getQName(i) + "=\"" + atts.getValue(i) + "\"");

        System.out.println(">");

        level++;
    }

    /**
     * Wird bei jedem schließenden Tag aufgerufen, definiert im Interface ContentHandler.
     *
     * @param namespaceURI URI des Namespaces für dieses Element, kann auch ein leerer String sein.
     * @param localName Lokaler Name des Elements.
     * @param qName Qualifizierter Name des Elements.
     */
    public void endElement(String namespaceURI, String localName, String qName)
    {
        level--;

        indent();

        System.out.println("</" + qName + ">");
    }

    /**
     * Wird immer aufgerufen, wenn Zeichen im Dokument auftauchen.
     *
     * @param ch Character Array
     * @param start Startindex der Zeichen in ch
     * @param length Länge der Zeichenkette
     */
    public void characters(char ch[], int start, int length)
    {
        String s = new String(ch,start,length).trim();
        if (s.length() > 0) {
            indent();
            System.out.println(s);
        }
    }

    /**
     * Wird aufgerufen, wenn Leerraum (" ", "\t", "\n", "\r") im Dokument
     * auftaucht, der für die Struktur des Dokuments nicht von Bedeutung ist. 
     *
     * @param ch Character Array
     * @param start Startindex der Zeichen in ch
     * @param length Länge der Zeichenkette
     */
    public void ignorableWhitespace(char[] ch, int start, int length)
    {
    }

    public static void main(String args[])
    {
        try {
            // Neuen SAX-Parser erzeugen
            SAXParserFactory factory   = SAXParserFactory.newInstance();
            SAXParser        saxParser = factory.newSAXParser();

            // XML Datei parsen, die entsprechenden Methoden des DefaultHandler
            // werden als Callback aufgerufen.
            saxParser.parse("heise.rdf",new Main());
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}