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 Möglichkeiten, mit XML zu arbeiten, die jeweils für unterschiedliche Aufgaben geeignet sind: vom Lesen kleiner Konfigurationen bis zur Verarbeitung von Gigabyte-großen Dateien. In diesem Artikel betrachten wir vier grundlegende Ansätze: DOM, SAX, StAX und JAXB.
1. DOM (Document Object Model) — vollständiges Laden in den Speicher
Der DOM-Parser lädt das gesamte XML-Dokument in den Speicher und erstellt eine baumartige Struktur. Dies ist praktisch für Navigation und Änderungen, aber ineffizient für große Dateien.
Beispiel zum Lesen von XML mit DOM:
import javax.xml.parsers.*;import org.w3c.dom.*;
public class DomExample { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml");
NodeList bookList = doc.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("Buch: " + title + ", Autor: " + author); } }}- Vorteile: bequemer Zugriff auf jeden Knoten, XPath-Unterstützung, Möglichkeit zur Änderung des Dokuments.
- Nachteile: benötigt viel Speicher, langsam bei großen Dateien.
- Wann verwenden: Konfigurationsdateien, kleine Dokumente (bis zu einigen MB).
2. SAX (Simple API for XML) — ereignisgesteuerter Streaming-Parser
SAX liest XML sequentiell und generiert Ereignisse (Elementanfang, Text, Elementende). Sie verarbeiten nur die benötigten Ereignisse – das ermöglicht die Arbeit mit Dateien beliebiger Größe.
Beispiel zur Verarbeitung von XML mit SAX:
import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class SaxExample extends DefaultHandler { private boolean inTitle = false;
public void startElement(String uri, String localName, String qName, Attributes attrs) { if (qName.equals("title")) inTitle = true; }
public void characters(char[] ch, int start, int length) { if (inTitle) System.out.println("Titel: " + new String(ch, start, length)); }
public void endElement(String uri, String localName, String qName) { if (qName.equals("title")) inTitle = false; }
public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse("books.xml", new SaxExample()); }}- Vorteile: minimaler Speicherverbrauch, hohe Geschwindigkeit.
- Nachteile: kein Zurückkehren zum vorherigen Element möglich, schwierig, das Dokument zu ändern.
- Wann verwenden: große XML-Dateien (Logs, Datenbank-Dumps, Berichte).
3. StAX (Streaming API for XML) — Streaming-Parser mit Cursor-Steuerung
StAX ist eine modernere Alternative zu SAX. Sie steuern das Lesen selbst, indem Sie den Cursor durch den XML-Stream bewegen. Es stehen zwei Modi zur Verfügung: Cursor API (Ereignis-Iterator) und Event API (Ereignisverarbeitung).
Beispiel mit Cursor API (XMLStreamReader):
import javax.xml.stream.*;
public class StaxExample { public static void main(String[] args) throws Exceptio Auch in der Bibliothek
Arbeiten mit Excel in Swift: Vollständiger Leitfaden zu Bibliotheken und Tools für iOS/macOS
Jest für TypeScript: Vollständiger Leitfaden zum Testen
Logging für C++: Die besten Lösungen (spdlog, glog, P7)
Elasticsearch .NET für C#: Vollständiges Tutorial mit Praxisbeispielen