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;
}
}
运行结果控制台界面: