java xml stax_基于Java StAX光标的API读取XML示例

java xml stax

Java StAX API provides two XML processing API – cursor based and iterator based. Earlier we saw examples of iterator based API to read XML file and write XML file. Here we will learn how to use cursor based API to read XML file.

Java StAX API提供了两个XML处理API – 基于游标基于迭代器 。 前面我们看到了基于迭代器的API的示例,该API可以读取XML文件写入XML文件 。 在这里,我们将学习如何使用基于游标的API来读取XML文件。

When we use StAX XML Parser, we need to create XMLInputFactory to read XML file. Then we can chose cursor based API by creating XMLStreamReader object to read file. XMLStreamReader next() method is used to get the next parsing event and it returns the int value depending on the event type. Common event types are Start Document, Start Element, Characters, End Element and End Document. XMLStreamConstants contains int constants that can be used to process events based on it’s type.

当使用StAX XML Parser时,我们需要创建XMLInputFactory来读取XML文件。 然后,我们可以通过创建XMLStreamReader对象以读取文件来选择基于游标的API。 XMLStreamReader next()方法用于获取下一个解析事件,并根据事件类型返回int值。 常见事件类型是“开始文档”,“开始元素”,“字符”,“结束元素”和“结束文档”。 XMLStreamConstants包含int常量,可以根据其类型来处理事件。

For this tutorial, we have below xml file that is list of Employee element.

对于本教程,我们在下面的xml文件中列出了Employee元素。

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
	<Employee id="1">
		<age>29</age>
		<name>Pankaj</name>
		<gender>Male</gender>
		<role>Java Developer</role>
	</Employee>
	<Employee id="2">
		<age>35</age>
		<name>Lisa</name>
		<gender>Female</gender>
		<role>CEO</role>
	</Employee>
	<Employee id="3">
		<age>40</age>
		<name>Tom</name>
		<gender>Male</gender>
		<role>Manager</role>
	</Employee>
	<Employee id="4">
		<age>25</age>
		<name>Meghna</name>
		<gender>Female</gender>
		<role>Manager</role>
	</Employee>
</Employees>

We have Employee class to represent the Employee element.

我们有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;
    }
    
}

Here is the class where we are using StAX XMLStreamReader to read the xml file to list of Employee object.

这是我们使用StAX XMLStreamReader读取xml文件到Employee对象列表的类。

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

When we execute above program, we get following output in console.

当我们执行上面的程序时,我们在控制台中得到以下输出。

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

翻译自: https://www.journaldev.com/1226/java-stax-cursor-based-api-read-xml-example

java xml stax

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值