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