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;
}
}
運行結果控制檯界面: