Работа с 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);
}
}
Сторонние библиотеки
Помимо встроенных средств, существует популярные сторонние библиотеки:
- JDOM — легковесная альтернатива DOM с более простым API. Удобна для быстрой разработки.
- DOM4J — ещё один «умный» DOM-подобный парсер с поддержкой XPath, XSLT и потоковой записи.