Работа с XML в Java: DOM, SAX, StAX и JAXB

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с XML в Java: DOM, SAX, StAX и JAXB

XML (eXtensible Markup Language) остаётся одним из ключевых форматов для хранения и передачи структурированных данных. В Java существует несколько способов работы с XML, каждый из которых подходит для разных задач: от чтения небольших конфигураций до обработки гигабайтных файлов. В этой статье мы разберём четыре основных подхода: DOM, SAX, StAX и JAXB.

1. DOM (Document Object Model) — полная загрузка в память

DOM-парсер загружает весь XML-документ в память, создавая древовидную структуру. Это удобно для навигации и модификации, но неэффективно для больших файлов.

Пример чтения XML с помощью 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("Книга: " + title + ", автор: " + author);
        }
    }
}
  • Плюсы: удобный доступ к любому узлу, поддержка XPath, возможность изменения документа.
  • Минусы: требует много памяти, медленный для больших файлов.
  • Когда использовать: конфигурационные файлы, небольшие документы (до нескольких МБ).

2. SAX (Simple API for XML) — событийный потоковый парсер

SAX читает XML последовательно и генерирует события (начало элемента, текст, конец элемента). Вы обрабатываете только нужные события — это позволяет работать с файлами любого размера.

Пример обработки XML с помощью 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("Название: " + 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());
    }
}
  • Плюсы: минимальное потребление памяти, высокая скорость.
  • Минусы: нельзя вернуться к предыдущему элементу, сложно модифицировать документ.
  • Когда использовать: большие XML-файлы (логи, дампы БД, отчёты).

3. StAX (Streaming API for XML) — потоковый парсер с управлением курсором

StAX — это более современная альтернатива SAX. Вы сами управляете чтением, перемещая курсор по XML-потоку. Доступны два режима: Cursor API (итератор событий) и Event API (обработка событий).

Пример с Cursor API (XMLStreamReader):

import javax.xml.stream.*;

public class StaxExample {
    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader reader = factory.createXMLStreamReader(
            StaxExample.class.getResourceAsStream("books.xml"));

        while (reader.hasNext()) {
            int event = reader.next();
            if (event == XMLStreamConstants.START_ELEMENT && "title".equals(reader.getLocalName())) {
                System.out.println("Название: " + reader.getElementText());
            }
        }
        reader.close();
    }
}
  • Плюсы: быстрее SAX, интуитивно понятный код, поддержка записи XML.
  • Минусы: нет встроенной валидации, сложнее модификация.
  • Когда использовать: потоковая обработка, создание XML-документов на лету.

4. JAXB (Java Architecture for XML Binding) — объектно-ориентированный подход

JAXB позволяет преобразовывать XML в Java-объекты (десериализация) и обратно (сериализация) с помощью ан

Рекомендаций