Рубрики
Без рубрики

Анализ XML – файла с помощью StAX

Узнайте, как проанализировать XML-файл с помощью StAX

Автор оригинала: baeldung.

1. введение

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

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

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

3. Класс XMLEventReader

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

  • IsStartElement() : проверяет, является ли текущее событие startElement (тег start)
  • isEndElement() : проверяет, является ли текущее событие конечным элементом (конечный тег)
  • как символы() : возвращает текущее событие в виде символов
  • getName() : получает имя текущего события
  • GetAttributes() : возвращает Итератор атрибутов текущего события

4. Реализация простого синтаксического анализатора XML

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

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

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

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

Затем нам нужно сначала найти нужный тег start:

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-файла:



    
        Baeldung
        Online Courses
        Online
    
    
        Example
        Examples
        Offline
    
    
        Localhost
        Tests
        Offline
    

Давайте проанализируем 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 .