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

Пример синтаксического анализатора Java Sax для чтения XML-файла

Пример Синтаксического Анализатора Sax. Пример синтаксического анализатора Java StAX для чтения xml-файла и анализа списка объектов, пример кода, XMLEventReader, nextEvent, элемент, атрибут.

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

Мы можем использовать синтаксический анализатор Java StAX для чтения XML-файла. Java Streaming API для XML (Java StAX) предоставляет реализацию для обработки XML в java. StAX состоит из двух наборов API – API на основе курсора и API на основе итератора .

Java StAX

API на основе курсора Java StAX позволяет приложению обрабатывать XML в виде потока токенов, называемых событиями; приложение может проверять состояние анализатора и получать информацию о последнем проанализированном событии, затем переходить к следующему событию и так далее. Это низкоуровневый API; несмотря на значительную эффективность, он не обеспечивает абстракцию базовой структуры XML.

API на основе итераторов более высокого уровня позволяет приложению обрабатывать XML в виде серии объектов событий, каждый из которых передает часть структуры XML приложению. Все, что нужно сделать приложению, это определить тип анализируемого события, привести его к соответствующему типу и использовать его методы для получения информации, связанной с событием.

В этом уроке мы узнаем, как читать XML итеративно, используя Java StAX . Он предоставляет заводские методы для создания XMLEventReader объекта, с помощью которого мы можем считывать xml-элементы как XML-событие . Некоторые полезные методы в реализации XMLEvent-это IsStartElement() и isEndElement () , чтобы определить, является ли это начальным тегом или конечным тегом.

В последнем уроке мы узнали, как написать xml-файл на java с помощью API итератора java StAX .

Для этого урока у нас есть следующий XML-файл, содержащий список сотрудников, мы будем использовать API итератора Java StAX для чтения XML-файла и создания списка объектов сотрудников.

Для этого урока у нас есть следующий XML-файл, содержащий список сотрудников, мы будем использовать API итератора Java StAX для чтения XML-файла и создания списка объектов сотрудников.



	
		29
		Pankaj
		Male
		Java Developer
	
	
		35
		Lisa
		Female
		Manager
	

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

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

package com.journaldev.xml;

public class Employee {
    private int id;
    private String name;
    private String gender;
    private int age;
    private String role;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    
    @Override
    public String toString() {
        return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +
                " Role=" + this.role;
    }
    
}

Пример синтаксического анализатора Java Sax для чтения XML-файла

Вот программа, которая считывает xml-файл и создает список сотрудников.

Вот программа, которая считывает xml-файл и создает список сотрудников.

package com.journaldev.xml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

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.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class StaxXMLReader {

    public static void main(String[] args) {
        String fileName = "/Users/pankaj/employee.xml";
        List empList = parseXML(fileName);
        for(Employee emp : empList){
            System.out.println(emp.toString());
        }
    }

    private static List parseXML(String fileName) {
        List empList = new ArrayList<>();
        Employee emp = null;
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        try {
            XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));
            while(xmlEventReader.hasNext()){
                XMLEvent xmlEvent = xmlEventReader.nextEvent();
               if (xmlEvent.isStartElement()){
                   StartElement startElement = xmlEvent.asStartElement();
                   if(startElement.getName().getLocalPart().equals("Employee")){
                       emp = new Employee();
                       //Get the 'id' attribute from Employee element
                       Attribute idAttr = startElement.getAttributeByName(new QName("id"));
                       if(idAttr != null){
                       emp.setId(Integer.parseInt(idAttr.getValue()));
                       }
                   }
                   //set the other varibles from xml elements
                   else if(startElement.getName().getLocalPart().equals("age")){
                       xmlEvent = xmlEventReader.nextEvent();
                       emp.setAge(Integer.parseInt(xmlEvent.asCharacters().getData()));
                   }else if(startElement.getName().getLocalPart().equals("name")){
                       xmlEvent = xmlEventReader.nextEvent();
                       emp.setName(xmlEvent.asCharacters().getData());
                   }else if(startElement.getName().getLocalPart().equals("gender")){
                       xmlEvent = xmlEventReader.nextEvent();
                       emp.setGender(xmlEvent.asCharacters().getData());
                   }else if(startElement.getName().getLocalPart().equals("role")){
                       xmlEvent = xmlEventReader.nextEvent();
                       emp.setRole(xmlEvent.asCharacters().getData());
                   }
               }
               //if Employee end element is reached, add employee object to list
               if(xmlEvent.isEndElement()){
                   EndElement endElement = xmlEvent.asEndElement();
                   if(endElement.getName().getLocalPart().equals("Employee")){
                       empList.add(emp);
                   }
               }
            }
            
        } catch (FileNotFoundException | XMLStreamException e) {
            e.printStackTrace();
        }
        return empList;
    }

}

Когда мы выполняем вышеуказанную программу, мы получаем следующий вывод в консоли.

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java Developer
Employee:: ID=2 Name=Lisa Age=35 Gender=Female Role=Manager

Это все для быстрого примера синтаксического анализа Java Sax для чтения XML-файла.