Работа с 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-объекты (десериализация) и обратно (сериализация) с помощью ан
Также в библиотеке
Криптография в C++: полное руководство по шифрованию и хешированию
WebSocket библиотеки Java: Полное руководство по реализации реального времени
Работа с CSV в PHP: библиотека SplFileObject и встроенные функции
Работа с датами в TypeScript: популярные библиотеки и примеры
unbuild для TypeScript: полное руководство с примерами