«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.
«