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 <img /> 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);
}
}
}
