Автор оригинала: 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"; ListempList = 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