Java StAX Parser Example读取XML文件

时间:2020-02-23 14:34:31  来源:igfitidea点击:

我们可以使用Java StAX解析器读取XML文件。
用于XML的Java流API(Java StAX)提供了用于在Java中处理XML的实现。
StAX由两组API组成-基于游标的API和基于迭代器的API。

Java StAX

基于Java StAX游标的API允许应用程序将XML作为令牌(又称为事件)流进行处理。
应用程序可以检查解析器的状态并获取有关上一个已解析事件的信息,然后前进到下一个事件,依此类推。
这是一个底层API。
尽管效率很高,但它没有提供底层XML结构的抽象。

基于高级迭代器的API允许应用程序将XML作为一系列事件对象进行处理,每个事件对象都将XML结构的一部分传达给应用程序。
应用程序所需要做的就是确定已解析事件的类型,将其转换为相应的类型,并使用其方法来获取与该事件相关的信息。

在本教程中,我们将学习如何使用Java StAX迭代读取XML。
它提供了工厂方法来创建XMLEventReader对象,通过该方法我们可以将XML元素读取为XMLEvent。
XMLEvent实现中一些有用的方法是isStartElement()isEndElement(),以确定它是开始标签还是结束标签。

在上一教程中,我们学习了如何使用Java StAX Iterator API在Java中编写xml文件。

在本教程中,我们有一个包含Employee列表的XML文件,我们将使用Java StAX Iterator API读取XML文件并创建Employee对象的列表。

employee.xml

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
	<Employee id="1">
		<age>29</age>
		<name>hyman</name>
		<gender>Male</gender>
		<role>Java Developer</role>
	</Employee>
	<Employee id="2">
		<age>35</age>
		<name>Lisa</name>
		<gender>Female</gender>
		<role>Manager</role>
	</Employee>
</Employees>

要将XML读取到Employees列表中,我们将首先创建Employee bean。

Employee.java

package com.theitroad.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 StAX Parser Example读取XML文件

这是读取xml文件并创建员工列表的程序。

StaxXMLReader.java

package com.theitroad.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/hyman/employee.xml";
      List<Employee> empList = parseXML(fileName);
      for(Employee emp : empList){
          System.out.println(emp.toString());
      }
  }

  private static List<Employee> parseXML(String fileName) {
      List<Employee> 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=hyman Age=29 Gender=Male Role=Java Developer
Employee:: ID=2 Name=Lisa Age=35 Gender=Female Role=Manager