Работа с 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< Также в библиотеке
kotlinx-datetime для Kotlin: полное руководство с примерами
Кэширование в C++: Redis, уровень данных и другие инструменты
Отправка SMS на Java: Обзор и примеры использования API библиотек (Twilio, Nexmo)
Стандартная библиотека JavaScript (Node.js): полный обзор
Koin — Dependency Injection контейнер для Kotlin