java读取xml文档之sax方式

sax方式是读取一行处理一行,这样的方式比较节省内存,而且效率很高,尤其处理超大的xml文档时更为明显,如果只是用来读取xml那么sax方式是最佳的,但是它不能用来对xml进行增删改。

xml测试文档:

<?xml version="1.0" encoding="UTF-8"?>
<商店>
    <商品>
        <名称>手机</名称>
        <价格>1290</价格>
        <数量>90部</数量>
    </商品>
    <商品>
        <名称>电脑</名称>
        <价格>11290</价格>
        <数量>10台</数量>
    </商品>
</商店>

Demo1.java

package com.cx.sax;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Demo1 {

    /**
     * @param args
     * @throws SAXException 
     * @throws ParserConfigurationException 
     * @throws IOException 
     */
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {


        //处理所有的数据都要封装为一个对象,对象的概念要建立起来
        //所以首先要对照这xml文件建立一个bean来封装数据
        //这样读取出来的数据就是一个个的对象,然后将对象放入list中。

        //1、创建解析工厂类
        SAXParserFactory factory = SAXParserFactory.newInstance();

        //2、得到解析器
        SAXParser sax = factory.newSAXParser();

        //3、得到读取器
        XMLReader reader = sax.getXMLReader();

        //4、设置内容处理器,需要建立一个处理器
        GoodsHandler handler = new GoodsHandler();
        reader.setContentHandler(handler);

        //5、读取XML文档
        reader.parse("src/test.xml");

        List<Goods> list = handler.getGoods();

        for(Goods g : list){
            System.out.println("名称:"+g.getName()+",价格:"+g.getPrice()+",数量:"+g.getNumber());
        }

    }

}


//继承默认的处理器可以选择需要的方法进行实现,如果使用接口则必须全部实现所有的方法,比较麻烦。
//这里只用到了startElement、characters、endElement三个方法
class GoodsHandler extends DefaultHandler{
    //初始化商品
    private Goods goods;
    //定义一个tag,保存当前的标签名称
    private String tag;
    //初始化list
    private List list = new ArrayList();


    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        //首先获得开始标签,判断name是否等于商品
        tag = name;
        if("商品".equals(name)){//这里字符一定要在前变量在后,否则会报空指针的错误,,注意!!!
            //如果相等,就new出一个goods对象
            goods = new Goods();

        }


    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //处理完开始标签就要处理内容了
        if("名称".equals(tag)){
            //获得名称标签体
            String name = new String(ch,start,length);
            //向对象中添加名称信息
            goods.setName(name);
        }
        if("价格".equals(tag)){
            //获得名称标签体
            String price = new String(ch,start,length);
            //向对象中添加名称信息
            goods.setPrice(price);
        }
        if("数量".equals(tag)){
            //获得名称标签体
            String number = new String(ch,start,length);
            //向对象中添加名称信息
            goods.setNumber(number);
        }

    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        //最后是处理结束标签
        if("商品".equals(name)){
            list.add(goods);
        }

        //一定要制空tag,否则会出错,可以打断点看一下运行的过程就知道为什么要制空了。
        tag = null;

    }



    //需要返回一个list,所以要添加一个list的get方法
    public List getGoods() {
        return list;
    }


}

Goods.java

package com.cx.sax;

public class Goods {
    private String name;
    private String price;
    private String number;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }

}

运行结果控制台界面:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010309756/article/details/76615090