SAX(Simple API For XML) 是一个公共的基于事件的XML文档解析标准,能够通过一个简单的、快速的方法来对XML文档进行处理和DOM相比它占用的系统资源更少。
SAX即使一个接口也是一个软件包。对文档进行进行顺序扫描,当扫描到文档开始、元素开始与结束、文档结束等地方通知事件处理函数,由事件处理函数做出相应的动作,然后继续同样的扫描,直到结束。
解析步骤:
1.编写事件处理程序(ContentHandler,一般继承DefaultHandler类,采用adapter模式)
2.创建SAX解析器。
3.将事件处理程序分配到解析器。
4.对文档进行处理,将每个事件发送给事件处理函数。
DefaultHandler接口常用方法:
void startDoucment();//文档解析开始的处理;
void endDoucment();//文档解析结束的处理;
void startElement(String uri,String localName,String qName,Attributes atts);//元素节点开始处理;
void endElement(String uri,String localName,String qName);//元素节点结束处理;
下面开始解析:
1.将xml文件放置在src/main/assets目录下。
XML文件内容如下:
<persons>
<person num="01">
<name>林丹</name>
<sex>男</sex>
<item>羽毛球</item>
</person>
<person num="02">
<name>吴敏霞</name>
<sex>女</sex>
<item>跳水</item>
</person>
<person num="03">
<name>张继科</name>
<sex>男</sex>
<item>乒乓球</item>
</person>
</persons>
2.创建对应的实体类
public class Person {
private String num;
private String name;
private String sex;
private String item;
public String getNum() {
return num;
}
public void setNum(String num) {
this.num= num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
public String getSex() {
returnsex;
}
public void setSex(String sex) {
this.sex= sex;
}
public String getItem() {
returnitem;
}
public void setItem(String item) {
this.item= item;
}
public Person(String num,String name,String sex,String item) {
this.num= num;
this.name= name;
this.sex= sex;
this.item= item;
}
public Person(){
}
@Override
public String toString() {
return"num '"+num+'\''+
", name '"+name+'\''+
", sex '"+sex+'\''+
", item '"+item+'\'';
}
}
3.编写事件处理程序
packagecom.example.office.utils;
import com.example.office.bean.Person;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
/**
* Created by office on 2016/8/9.
*/
public class MyDealHandler extends DefaultHandler {
private List< Person > persons;
private String tag;//用于标记当前处理的元素
private Person person;
//获取处理的结果
public List< Person> getPersons(){
return persons;
}
@Override
public void startDocument()throwsSAXException {
super.startDocument();
persons=new ArrayList<>();
}
@Override
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
super.startElement(uri,localName,qName,attributes);
if ("person".equals(qName)){
person=new Person();
String num=attributes.getValue("num");
person.setNum(num);
}
tag=qName;
}
@Override
public void characters(char[] ch, int start, intlength)throwsSAXException {
super.characters(ch,start,length);
if (tag!=null) {
String data =new String(ch,start,length).trim();
if ("name".equals(tag)) {
person.setName(data);
}else if("sex".equals(tag)) {
person.setSex(data);
}else if("item".equals(tag)) {
person.setItem(data);
}
}
}
@Override
public void endElement(String uri,String localName,String qName) throws SAXException {
super.endElement(uri,localName,qName);
if ("person".equals(qName)){
persons.add(person);
person=null;
}
tag=null;
}
@Override
public voidendDocument()throwsSAXException {
super.endDocument();
}
}
4.创建解析器
packagecom.example.office.utils;
import com.example.office.bean.Person;
import org.xml.sax.SAXException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MySaxParse {
public List< Person > parseXml(InputStream inputStream) {
List<Person> personList=new ArrayList<Person>();
//获取解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=null;
MyDealHandler handler=null;
try {
//获取解析器
parser = factory.newSAXParser();
handler=new MyDealHandler();
parser.parse(inputStream,handler);
}catch(ParserConfigurationException e) {
e.printStackTrace();
}catch(SAXException e) {
e.printStackTrace();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
personList=handler.getPersons();
return personList;
}
}
5.在Activity中处理并获取结果
MySaxParse parse=new MySaxParse();//获取解析器对象
AssetManager asset = getAssets();
InputStream input=null;
try {
input = asset.open("person.xml");//得到assets目录下的xml文件
} catch(IOException e) {
e.printStackTrace();
}
List<Person> list=parse.parseXml(input);//调用解析器得到结果