java读取xml文档之sax方式

来源:互联网 发布:求解最短路径的算法 编辑:程序博客网 时间:2024/06/05 08:43

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

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