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

Пример чтения XML API на основе курсора Java StAX

Java StAX API предоставляет два API обработки XML – на основе курсора и на основе итератора. Ранее мы видели примеры API на основе итератора для чтения XML-файла и записи

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

Java StAX API предоставляет два API обработки XML – на основе курсора и на основе итератора . Ранее мы видели примеры API на основе итератора для чтения XML-файла и записи XML-файла . Здесь мы узнаем, как использовать API на основе курсора для чтения XML-файла.

Когда мы используем синтаксический анализатор XML StAX, нам нужно создать XMLInputFactory для чтения XML-файла. Затем мы можем выбрать API на основе курсора, создав XMLStreamReader объект для чтения файла. Метод XMLStreamReader next() используется для получения следующего события синтаксического анализа и возвращает значение int в зависимости от типа события. Распространенными типами событий являются Начальный документ, Начальный элемент, Символы, Конечный элемент и Конечный документ. XMLStreamConstants содержит константы int, которые можно использовать для обработки событий в зависимости от их типа.

Для этого урока ниже приведен xml-файл, представляющий собой список элементов сотрудника.



	
		29
		Pankaj
		Male
		Java Developer
	
	
		35
		Lisa
		Female
		CEO
	
	
		40
		Tom
		Male
		Manager
	
	
		25
		Meghna
		Female
		Manager
	

У нас есть класс Employee для представления элемента Employee.

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;
    }
    
}

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

package com.journaldev.xml.stax;

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

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import com.journaldev.xml.Employee;

public class StaxXMLStreamReader {
    
    private static boolean bName;
    private static boolean bAge;
    private static boolean bGender;
    private static boolean bRole;

    public static void main(String[] args) {
        String fileName = "/Users/pankaj/employees.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 {
            XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream(fileName));
            int event = xmlStreamReader.getEventType();
            while(true){
                switch(event) {
                case XMLStreamConstants.START_ELEMENT:
                    if(xmlStreamReader.getLocalName().equals("Employee")){
                        emp = new Employee();
                        emp.setId(Integer.parseInt(xmlStreamReader.getAttributeValue(0)));
                    }else if(xmlStreamReader.getLocalName().equals("name")){
                        bName=true;
                    }else if(xmlStreamReader.getLocalName().equals("age")){
                        bAge=true;
                    }else if(xmlStreamReader.getLocalName().equals("role")){
                        bRole=true;
                    }else if(xmlStreamReader.getLocalName().equals("gender")){
                        bGender=true;
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    if(bName){
                        emp.setName(xmlStreamReader.getText());
                        bName=false;
                    }else if(bAge){
                        emp.setAge(Integer.parseInt(xmlStreamReader.getText()));
                        bAge=false;
                    }else if(bGender){
                        emp.setGender(xmlStreamReader.getText());
                        bGender=false;
                    }else if(bRole){
                        emp.setRole(xmlStreamReader.getText());
                        bRole=false;
                    }
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    if(xmlStreamReader.getLocalName().equals("Employee")){
                        empList.add(emp);
                    }
                    break;
                }
                if (!xmlStreamReader.hasNext())
                    break;

              event = xmlStreamReader.next();
            }
            
        } 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=CEO
Employee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager
Employee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager