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