Рубрики

StAX XML Parser в Java

Эта статья посвящена тому, как можно проанализировать XML-файл в Java.

XML: XML расшифровывается как расширяемый язык разметки. Он был разработан для хранения и транспортировки данных. Это было разработано, чтобы быть и человеческим и машиночитаемым. Вот почему цели разработки XML подчеркивают простоту, универсальность и удобство использования в Интернете.

Почему StAX вместо SAX?

  • SAX : SAX — это API модели push, что означает, что это API, который вызывает ваш обработчик, а не ваш обработчик, который вызывает API. Таким образом, синтаксический анализатор SAX «помещает» события в ваш обработчик. С этой push-моделью API вы не можете контролировать, как и когда анализатор выполняет итерации по файлу. Как только вы запускаете синтаксический анализатор, он повторяется до конца, вызывая ваш обработчик для каждого события XML во входном XML-документе.
    SAX Parser --> Handler
  • StAX : модель извлечения StAX означает, что именно ваш класс-обработчик вызывает API синтаксического анализатора, а не наоборот. Таким образом, ваш класс-обработчик контролирует, когда парсер должен перейти к следующему событию во входных данных. Другими словами, ваш обработчик «вытягивает» события XML из анализатора. Кроме того, вы можете остановить анализ в любой момент. Синтаксический анализатор StAX обычно используется вместо средства чтения файлов, когда входные данные или база данных представлены в виде автономного или онлайнового файла XML. Модель извлечения сводится к следующему:
    Handler --> StAX Parser
    

    Также анализатор StAX может читать и записывать в документы XML, в то время как SAX может только читать. SAX обеспечивает проверку схемы, т. Е. Если теги вложены правильно или XML правильно написан, но StAX не предоставляет такой метод проверки схемы.

Реализация

Идея о том, как работает парсер StAX:

Входной файл: это образец входного файла, созданный автором в качестве примера, чтобы показать, как используется анализатор StAX. Сохраните его как data.xml и запустите код. Файлы базы данных XML обычно имеют большой размер и содержат много тегов, вложенных друг в друга.

<company class="geeksforgeeks.org">
    <name>Kunal Sharma</name>
    <title>Student</title>
    <email>kunal@example.com</email>
    <phone>(202) 456-1414</phone>
</company>

// Java-код для реализации синтаксического анализатора StAX

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.util.Iterator;

import javax.xml.namespace.QName;

import javax.xml.stream.XMLEventReader;

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLStreamException;

import javax.xml.stream.events.*;

  

public class Main

{

  

    private static boolean bcompany,btitle,bname,bemail,bphone;

  

    public static void main(String[] args) throws FileNotFoundException,

                                                  XMLStreamException

    {

        // Создать объект File с соответствующим именем файла xml

        File file = new File("data.xml");

  

        // Функция для доступа к данным

        parser(file);

    }

  

    public static void parser(File file) throws FileNotFoundException,

                                                   XMLStreamException

    {

        // Переменные, чтобы убедиться, что элемент

        // в xml обращаются или нет

        // если false, то это означает, что элементы

        // в настоящее время не используется, если true, элемент или

        // тег используется

        bcompany = btitle = bname = bemail = bphone = false;

  

        // Экземпляр класса, который помогает при чтении тегов

        XMLInputFactory factory = XMLInputFactory.newInstance();

  

        // Инициализация обработчика для доступа к тегам в файле XML

        XMLEventReader eventReader =

                 factory.createXMLEventReader(new FileReader(file));

  

        // Проверка наличия следующего тега

        while (eventReader.hasNext())

        {

            // Событие на самом деле является тегом. 3 типа

            // <name> = StartEvent

            // </ name> = EndEvent

            // данные между StartEvent и EndEvent

            // которое является событием символов

            XMLEvent event = eventReader.nextEvent();

  

            // Это сработает, когда тег имеет тип <...>

            if (event.isStartElement())

            {

                StartElement element = (StartElement)event;

  

                // Итератор для доступа к метаданным

                // тег начался.

                // Здесь было бы название компании

                Iterator<Attribute> iterator = element.getAttributes();

                while (iterator.hasNext())

                {

                    Attribute attribute = iterator.next();

                    QName name = attribute.getName();

                    String value = attribute.getValue();

                    System.out.println(name+" = " + value);

                }

  

                // Проверка, какой тег нужно открыть для чтения.

                // Если тег совпадает, то логическое значение этого тега

                // установлено в true.

                if (element.getName().toString().equalsIgnoreCase("comapany"))

                {

                    bcompany = true;

                }

                if (element.getName().toString().equalsIgnoreCase("title"))

                {

                    btitle = true;

                }

                if (element.getName().toString().equalsIgnoreCase("name"))

                {

                    bname = true;

                }

                if (element.getName().toString().equalsIgnoreCase("email"))

                {

                    bemail = true;

                }

                if (element.getName().toString().equalsIgnoreCase("phone"))

                {

                    bphone = true;

                }

            }

  

            // Это будет срабатывать, когда тег имеет тип </ ...>

            if (event.isEndElement())

            {

                EndElement element = (EndElement) event;

  

                // Проверка, какой тег нужно закрыть после прочтения.

                // Если тег совпадает, то логическое значение этого тега

                // устанавливается в ложь.

                if (element.getName().toString().equalsIgnoreCase("comapany"))

                {

                    bcompany = false;

                }

                if (element.getName().toString().equalsIgnoreCase("title"))

                {

                    btitle = false;

                }

                if (element.getName().toString().equalsIgnoreCase("name"))

                {

                    bname = false;

                }

                if (element.getName().toString().equalsIgnoreCase("email"))

                {

                    bemail = false;

                }

                if (element.getName().toString().equalsIgnoreCase("phone"))

                {

                    bphone = false;

                }

            }

  

            // срабатывает, когда после тега есть данные

            // в настоящее время открыт.

            if (event.isCharacters())

            {

                // В зависимости от открытого тега данные извлекаются.

                Characters element = (Characters) event;

                if (bcompany)

                {

                    System.out.println(element.getData());

                }

                if (btitle)

                {

                    System.out.println(element.getData());

                }

                if (bname)

                {

                    System.out.println(element.getData());

                }

                if (bemail)

                {

                    System.out.println(element.getData());

                }

                if (bphone)

                {

                    System.out.println(element.getData());

                }

            }

        }

    }

}

Выход :

name = geeksforgeeks.org
Kunal Sharma
Student
kunal@example.com
(202) 456-1414

Как работает StAX в приведенном выше коде?

После создания EventReader в приведенном выше коде с помощью фабричного шаблона для создания устройства чтения XML-файлов он в основном начинается с чтения тега <…>. Как только появляется тег <…>, для логической переменной устанавливается значение true, указывающее, что тег был открыт. Это сопоставление тегов выполняется путем определения, является ли это начальный тег или конечный тег. Поскольку тег <…> указывает на начало, следовательно, он соответствует StartElement. Далее идет часть чтения данных. На следующем шаге он считывает символ / данные путем сопоставления элемента с помощью isCharacters, это делается только в том случае, если начальный тег, который нам требуется, открыт или его логическая переменная установлена в значение true. После этого происходит закрытие элемента, обозначенного тегом </…>. Как только он встречает </ ..>, он проверяет, какой из элементов был открыт или установлен в значение true, и устанавливает для этого элемента логическое значение false или закрывает его.
По сути, каждое событие сначала открывает тег, читает его данные, а затем закрывает его.

Эта статья предоставлена Куналом Шармой . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

StAX XML Parser в Java

0.00 (0%) 0 votes