Java解析XML数据之SAX解析方式

在开发中经常会和XML数据打交道,尽管在工作中已经有相关负责人将代码封装好了,但我认为还是应该学习一些关于xml解析的知识,便于日后的开发工作。
xml被广泛应用于Java编程之中,目前比较有名的框架都有对xml的支持,比如Spring、Mybatis在开发中常用的方式是用xml方式配置,
在开发中经常使用到的web service是使用xml协议传输数据的。所以我认为有必要学习一些xml解析的知识,并以此作为笔记。
xml文件中包含各个节点,每一个节点之中都用来存储数据。

定义一个xml文件:Person.xml

<?xml version="1.0" encoding="utf-8" ?>
<Persons>
    <Person id="1">
        <name>jack</name>
        <age>18</age>
        <sex></sex>
    </Person>

    <Person id="2">
        <name>rose</name>
        <age>20</age>
        <sex></sex>
    </Person>

    <Person id="3">
        <name>tom</name>
        <age>28</age>
        <sex></sex>
    </Person>
</Persons>

然后根据xml文件的内容编写一个对应的Java bean。

package xml.bean;

public class Person {
    private int id;
    private String name;
    private String sex;
    private int age;

    public Person() {
    }

    public Person(int id, String name, String sex, int age) {

        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

开始编写SaxParserHandler,sax处理xml文件常用到一下五个方法,也是sax解析xml文件的流程:
startDocument —>文档读取开始
startElement —>标签读取开始
characters —>读取标签的内容
endElement —>标签读取结束
endDocument —>文档读取结束
sax处理xml文档时,首先会读取该文档,调用startDocument 方法,标志着xml文件解析的开始,然后是逐标签读取,方式是读取开始标签调用startElement、读取标签内容调用characters、读取结束标签调用endElement。

package xml.sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import xml.bean.Person;

import java.util.ArrayList;
import java.util.List;

public class SaxParserHandler extends DefaultHandler {
    public List<Person> list = null;
    Person person = null;
    String value = "";

    //文档开始
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        list = new ArrayList<>();
        System.out.println("解析开始");
    }

    //文档结束
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析结束");
    }

    //遍历开始标签
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if (qName.trim().equals("Person")) {
            person = new Person();
            int id = Integer.parseInt(attributes.getValue("id"));
            person.setId(id);
        }
    }

    //遍历结束标签
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (qName.trim().equals("Person")) {
            list.add(person);
            person = null;
        } else if (qName.trim().equals("name"))
            person.setName(value);
        else if (qName.trim().equals("age"))
            person.setAge(Integer.parseInt(value));
        else if (qName.trim().equals("sex"))
            person.setSex(value);
    }

    //获取元素值
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        value = new String(ch, start, length);
    }
}

最后是对该方式的测试:

package xml.saxtest;

import org.junit.Test;
import org.xml.sax.SAXException;

import xml.bean.Person;
import xml.sax.SaxParserHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class SaxTest {
    @Test
    public void test() throws ParserConfigurationException, SAXException, IOException {
        //获取sax解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //通过工厂获取SaxParser实例
        SAXParser parser = factory.newSAXParser();
        //实例化自己创建的SaxParserHandler
        SaxParserHandler handler = new SaxParserHandler();
        File file = new File("src/person.xml");
        parser.parse(file, handler);
        List<Person> list = handler.list;
        System.out.println(list.toString());
    }
}

以上是对使用sax方式解析xml文件的方式,代码托管在GitHub和CSDN下载上,地址如下
GitHub地址:
https://github.com/JetBraind/DataParser.git
CSDN下载地址:
http://download.csdn.net/download/feixiang_gao/10218725

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值