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

}

運行結果控制檯界面:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章