Демистификация синтаксического анализа XML: изучение библиотек Xerces и JAXB

XML (расширяемый язык разметки) — популярный формат хранения структурированных данных и обмена ими. Для эффективной работы с данными XML разработчики часто используют библиотеки синтаксического анализа XML. В этой статье мы рассмотрим две широко используемые библиотеки синтаксического анализа XML: Xerces и JAXB. Мы углубимся в различные методы, предоставляемые этими библиотеками, сопровождаемые примерами кода, чтобы помочь вам понять, как эффективно анализировать XML-данные.

  1. Библиотека Xerces:
    Xerces — это высокопроизводительный анализатор XML с открытым исходным кодом, разработанный Apache Software Foundation. Он предоставляет полный набор API-интерфейсов для анализа, манипулирования и проверки XML-документов.

а. Анализ DOM (объектной модели документа).
Анализ DOM создает в памяти древовидное представление всего XML-документа, что позволяет легко перемещаться и манипулировать элементами XML. Вот пример анализа XML-файла с использованием Xerces DOM:

import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
public class XercesDOMParserExample {
    public static void main(String[] args) throws Exception {
        DOMParser parser = new DOMParser();
        parser.parse("example.xml");
        Document document = parser.getDocument();
        NodeList nodeList = document.getElementsByTagName("book");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            System.out.println(node.getTextContent());
        }
    }
}

б. Синтаксический анализ SAX (простой API для XML).
Разбор SAX — это управляемый событиями подход, при котором XML-документы обрабатываются последовательно. Он эффективно использует память и подходит для больших файлов XML. Вот пример анализа XML-файла с помощью Xerces SAX:

import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
public class XercesSAXParserExample {
    public static void main(String[] args) throws Exception {
        SAXParser parser = new SAXParser();
        parser.setContentHandler(new DefaultHandler() {
            @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) {
                System.out.println("Element: " + qName);
            }
            @Override
            public void characters(char[] ch, int start, int length) {
                String text = new String(ch, start, length).trim();
                if (!text.isEmpty()) {
                    System.out.println("Text: " + text);
                }
            }
        });
        parser.parse("example.xml");
    }
}
  1. Библиотека JAXB:
    JAXB (архитектура Java для привязки XML) — это Java API для сопоставления объектов Java с представлениями XML и наоборот. Это упрощает привязку данных XML и устраняет необходимость ручного анализа и сериализации.

а. Демаршалинг XML в объекты Java:
JAXB позволяет без особых усилий преобразовывать данные XML в объекты Java. Вот пример демаршаллинга XML-файла с помощью JAXB:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
public class JAXBUnmarshallingExample {
    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(Bookstore.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        Bookstore bookstore = (Bookstore) unmarshaller.unmarshal(new File("example.xml"));
        for (Book book : bookstore.getBooks()) {
            System.out.println(book.getTitle());
        }
    }
}

б. Маршалинг объектов Java в XML:
JAXB также позволяет преобразовывать объекты Java в представление XML. Вот пример маршаллинга объектов Java в XML с использованием JAXB:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.File;
public class JAXBMarshallingExample {
    public static void main(String[] args) throws JAXBException {
        Bookstore bookstore = new Bookstore();
        // populate the bookstore object
        JAXBContext jaxbContext = JAXBContext.newInstance(Bookstore.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(bookstore, new File("example.xml"));
    }
}