Arbeiten mit XML in Java: DOM, SAX, StAX und JAXB
XML (eXtensible Markup Language) bleibt eines der wichtigsten Formate zum Speichern und Übertragen strukturierter Daten. In Java gibt es mehrere integrierte und beliebte Bibliotheken für die Arbeit mit XML. In diesem Artikel werden wir alle grundlegenden Ansätze behandeln: von den klassischen DOM und SAX bis hin zum modernen JAXB.
1. DOM (Document Object Model) – vollständiger Zugriff auf das Dokument
Der DOM-Parser lädt das gesamte XML-Dokument als Baumstruktur in den Arbeitsspeicher. Dies bietet vollständige Kontrolle über das Dokument: Knoten können gelesen, geändert, gelöscht und hinzugefügt werden.
Vorteile von DOM:
- Direkter Zugriff auf jedes Element des Dokuments
- Möglichkeit zur Änderung der XML-Struktur
- Intuitiv verständliches Objektmodell
Nachteile:
- Hoher Speicherverbrauch (gesamtes Dokument im RAM)
- Langsame Verarbeitung großer Dateien
Beispiel für die Verwendung von DOM:
import javax.xml.parsers.*;import org.w3c.dom.*;import java.io.*;
public class DomExample { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("books.xml"));
NodeList bookList = document.getElementsByTagName("book"); for (int i = 0; i < bookList.getLength(); i++) { Element book = (Element) bookList.item(i); String title = book.getElementsByTagName("title").item(0).getTextContent(); String author = book.getElementsByTagName("author").item(0).getTextContent(); System.out.println(title + " — " + author); } }}2. SAX (Simple API for XML) – Streaming-Parsing
SAX ist ein ereignisgesteuerter Parser. Er liest XML sequentiell und ruft Callback-Methoden auf, wenn ein öffnender/schließender Tag, Text oder Attribute auftreten. Der Speicherverbrauch ist minimal.
Wann SAX verwendet werden sollte:
- Sehr große XML-Dateien (mehrere hundert Megabyte)
- Nur lesender Zugriff, ohne Änderungen
- Begrenzte Geräteressourcen
Beispiel eines SAX-Parsers:
import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class SaxExample { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() { boolean isTitle = false;
public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equalsIgnoreCase("title")) isTitle = true; }
public void characters(char ch[], int start, int length) { if (isTitle) { System.out.println("Title: " + new String(ch, start, length)); isTitle = false; } } };
saxParser.parse("books.xml", handler); }}3. StAX (Streaming API for XML) – komfortables Streaming-Parsing
StAX ist ein Kompromiss zwischen DOM und SAX. Es arbeitet ebenfalls im Streaming-Modus, bietet aber eine benutzerfreundlichere Pull-Schnittstelle (Sie fordern das nächste Element selbst an).
Zwei Arbeitsweisen mit StAX:
- XMLStreamReader – zum Lesen
- XMLStreamWriter – zum Schreiben
import javax.xml.stream.*;import java.io.*;
public class StaxExample { public static void main(String[] args) throws Exception { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReade