Работа с XML в Java: DOM, SAX, StAX и JAXB — полное руководство

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

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

Начать курс

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

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

1. DOM (Document Object Model) — полный доступ к документу

DOM-парсер загружает весь XML-документ в память в виде древовидной структуры. Это даёт полный контроль над документом: можно читать, изменять, удалять и добавлять узлы.

Преимущества DOM:

  • Произвольный доступ к любому элементу документа
  • Возможность модификации структуры XML
  • Интуитивно понятная объектная модель

Недостатки:

  • Высокое потребление памяти (весь документ в ОЗУ)
  • Медленная работа с большими файлами

Пример использования 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) — потоковый парсинг

SAX — это событийно-ориентированный парсер. Он читает XML последовательно и вызывает callback-методы при встрече открывающего/закрывающего тега, текста или атрибутов. Память расходуется минимально.

Когда использовать SAX:

  • Огромные XML-файлы (сотни мегабайт)
  • Только чтение, без модификации
  • Ограниченные ресурсы устройства

Пример SAX-парсера:

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) — удобный потоковый парсинг

StAX — это компромисс между DOM и SAX. Он также работает в потоковом режиме, но предоставляет более удобный pull-интерфейс (вы сами запрашиваете следующий элемент).

Два способа работы со StAX:

  • XMLStreamReader — для чтения
  • XMLStreamWriter — для записи
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.createXMLStreamReader(
                new FileInputStream("books.xml"));

        while (reader.hasNext()) {
            int event = reader.next();
            if (event == XMLStreamConstants.START_ELEMENT) {
                if ("title".equals(reader.getLocalName())) {
                    System.out.println("Title: " + reader.getElementText());
                }
            }
        }
        reader.close();
    }
}

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

JAXB — это стандарт Java EE для автоматического преобразования Java-объектов в XML и обратно. Он использует аннотации для маппинга.

Основные аннотации JAXB:

  • @XmlRootElement — корневой элемент
  • @XmlElement — поле или свойство
  • @XmlAttribute — атрибут XML
  • @XmlType — порядок элементов

Пример JAXB:

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import java.util.*;

@XmlRootElement
class Library {
    private List<                    

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