«1. Введение

В этом руководстве мы покажем, как анализировать файл XML с помощью StAX. Мы реализуем простой синтаксический анализатор XML и посмотрим, как он работает, на примере.

2. Синтаксический анализ с помощью StAX

StAX — одна из нескольких библиотек XML в Java. Это библиотека с эффективным использованием памяти, включенная в JDK начиная с Java 6. StAX не загружает весь XML в память. Вместо этого он извлекает данные из потока только в прямом направлении. Поток читается объектом XMLEventReader.

3. Класс XMLEventReader

В StAX любой начальный или конечный тег является событием. XMLEventReader читает файл XML как поток событий. Он также предоставляет методы, необходимые для разбора XML. Наиболее важные методы:

    isStartElement(): проверяет, является ли текущее событие StartElement (начальным тегом) isEndElement(): проверяет, является ли текущее событие EndElement (конечным тегом) asCharacters(): возвращает текущее событие как символов getName(): получает имя текущего события getAttributes(): возвращает итератор атрибутов текущего события

4. Реализация простого синтаксического анализатора XML прочитайте это. Нам нужна XMLInputFactory для создания XMLEventReader для чтения нашего файла:

Теперь, когда XMLEventReader готов, мы продвигаемся вперед по потоку с помощью nextEvent():

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path));

Далее нам нужно найти наш желаемый начальный тег:

while (reader.hasNext()) {
    XMLEvent nextEvent = reader.nextEvent();
}

Следовательно, мы можем прочитать атрибуты и данные:

if (nextEvent.isStartElement()) {
    StartElement startElement = nextEvent.asStartElement();
    if (startElement.getName().getLocalPart().equals("desired")) {
        //...
    }
}

Мы также можем проверить, достигли ли мы конечного тега:

String url = startElement.getAttributeByName(new QName("url")).getValue();
String name = nextEvent.asCharacters().getData();

5. Пример синтаксического анализа

if (nextEvent.isEndElement()) {
    EndElement endElement = nextEvent.asEndElement();
}

Чтобы лучше понять, давайте запустим наш синтаксический анализатор на образце XML-файла:

Давайте проанализируем XML и сохраним все данные в списке объектов сущностей, называемых веб-сайтами:

<?xml version="1.0" encoding="UTF-8"?>
<websites>
    <website url="https://baeldung.com">
        <name>Baeldung</name>
        <category>Online Courses</category>
        <status>Online</status>
    </website>
    <website url="http://example.com">
        <name>Example</name>
        <category>Examples</category>
        <status>Offline</status>
    </website>
    <website url="http://localhost:8080">
        <name>Localhost</name>
        <category>Tests</category>
        <status>Offline</status>
    </website>
</websites>

Чтобы получить все свойства каждого веб-сайта, мы проверяем startElement.getName().getLocalPart() для каждого события. Затем мы соответствующим образом устанавливаем соответствующее свойство.

while (reader.hasNext()) {
    XMLEvent nextEvent = reader.nextEvent();
    if (nextEvent.isStartElement()) {
        StartElement startElement = nextEvent.asStartElement();
        switch (startElement.getName().getLocalPart()) {
            case "website":
                website = new WebSite();
                Attribute url = startElement.getAttributeByName(new QName("url"));
                if (url != null) {
                    website.setUrl(url.getValue());
                }
                break;
            case "name":
                nextEvent = reader.nextEvent();
                website.setName(nextEvent.asCharacters().getData());
                break;
            case "category":
                nextEvent = reader.nextEvent();
                website.setCategory(nextEvent.asCharacters().getData());
                break;
            case "status":
                nextEvent = reader.nextEvent();
                website.setStatus(nextEvent.asCharacters().getData());
                break;
        }
    }
    if (nextEvent.isEndElement()) {
        EndElement endElement = nextEvent.asEndElement();
        if (endElement.getName().getLocalPart().equals("website")) {
            websites.add(website);
        }
    }
}

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

6. Заключение

В этом уроке мы узнали, как анализировать файл XML с помощью библиотеки StAX.

XML-файл примера и полный код парсера, как всегда, доступны на Github.

«