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 .