Перейти к основному содержимому

Разбор XML-файла с помощью StAX

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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

Излишне говорить, что первым шагом при разборе XML является его чтение. Нам нужна XMLInputFactory для создания XMLEventReader для чтения нашего файла:

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

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

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();

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

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

5. Пример разбора

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

<?xml version="1.0" encoding="UTF-8"?>
<websites>
<website url="https://foreach.com">
<name>ForEach</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>

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

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);
}
}
}

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

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

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

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

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