Работа с XML в Java: библиотеки и инструменты для парсинга

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

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

Начать курс

Работа с XML в Java: обзор библиотек и инструментов

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

Встроенные API для работы с XML

В стандартную библиотеку Java (Java SE) входят три основных API для парсинга и обработки XML:

1. DOM (Document Object Model)

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

Когда использовать: когда нужно часто модифицировать документ или выполнять сложные запросы к его структуре.

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("data.xml");

        NodeList books = doc.getElementsByTagName("book");
        for (int i = 0; i < books.getLength(); i++) {
            Element book = (Element) books.item(i);
            String title = book.getElementsByTagName("title").item(0).getTextContent();
            System.out.println("Книга: " + title);
        }
    }
}

2. SAX (Simple API for XML)

SAX — это событийно-ориентированный парсер. Он читает документ последовательно и вызывает методы-обработчики при встрече тегов, атрибутов или текста. Не создаёт дерево в памяти, поэтому идеален для больших файлов.

Когда использовать: для потоковой обработки огромных XML-файлов (например, логов или экспортных данных).

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class SaxExample extends DefaultHandler {
    public void startElement(String uri, String localName, String qName, Attributes attrs) {
        if ("book".equals(qName)) {
            System.out.println("Найдена книга с id: " + attrs.getValue("id"));
        }
    }

    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        parser.parse("data.xml", new SaxExample());
    }
}

3. StAX (Streaming API for XML)

StAX — это потоковый pull-парсер. В отличие от SAX, где события «толкаются» в обработчик, StAX позволяет программе запрашивать следующий элемент (pull-модель). Это даёт больше контроля над процессом парсинга.

Когда использовать: когда нужна гибкость SAX, но с возможностью приостанавливать и возобновлять чтение.

import javax.xml.stream.*;

public class StaxExample {
    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader reader = factory.createXMLStreamReader(
                new java.io.FileInputStream("data.xml"));

        while (reader.hasNext()) {
            int event = reader.next();
            if (event == XMLStreamConstants.START_ELEMENT && "title".equals(reader.getLocalName())) {
                System.out.println("Название: " + reader.getElementText());
            }
        }
        reader.close();
    }
}

Связывание XML с Java-объектами: JAXB

JAXB (Java Architecture for XML Binding) — это стандартный API для преобразования XML в Java-объекты и обратно (маршаллинг/демаршаллинг). Позволяет работать с XML на уровне классов, а не низкоуровневых узлов.

Когда использовать: для REST/SOAP веб-сервисов, конфигураций и обмена данными между системами.

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

@XmlRootElement
class Book {
    @XmlElement
    private String title;
    @XmlAttribute
    private int id;
    // геттеры/сеттеры (опущены для краткости)
}

public class JaxbExample {
    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance(Book.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Book book = (Book) unmarshaller.unmarshal(new java.io.File("book.xml"));
        System.out.println("Загружена книга: " + book.title);
    }
}

Сторонние библиотеки

Помимо встроенных средств, существует популярные сторонние библиотеки:

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