Android中SAX解析XML的使用
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目录下。
假设文件内容如下:
<persons>
<personnum="01">
<name>林丹</name>
<sex>男</sex>
<item>羽毛球</item>
</person>
<personnum="02">
<name>吴敏霞</name>
<sex>女</sex>
<item>跳水</item>
</person>
<personnum="03">
<name>张继科</name>
<sex>男</sex>
<item>乒乓球</item>
</person>
</persons>
2.创建对应的实体类
public class Person {
privateString num;
private Stringname;
private Stringsex;
private Stringitem;
public StringgetNum() {
returnnum;
}
public voidsetNum(String num) {
this.num= num;
}
publicString getName() {
returnname;
}
public voidsetName(String name) {
this.name= name;
}
publicString getSex() {
returnsex;
}
public voidsetSex(String sex) {
this.sex= sex;
}
publicString getItem() {
returnitem;
}
public voidsetItem(String item) {
this.item= item;
}
publicPerson(String num,String name,String sex,String item) {
this.num= num;
this.name= name;
this.sex= sex;
this.item= item;
}
publicPerson(){
}
@Override
publicString 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 extendsDefaultHandler {
privateList<Person> persons;
private Stringtag;//用于标记当前处理的元素
private Personperson;
//获取处理的结果
public List<Person>getPersons(){
returnpersons;
}
@Override
public voidstartDocument()throws SAXException {
super.startDocument();
persons=newArrayList<>();
}
@Override
public voidstartElement(String uri,String localName,String qName,Attributes attributes)throws SAXException {
super.startElement(uri,localName,qName,attributes);
if ("person".equals(qName)){
person=newPerson();
String num=attributes.getValue("num");
person.setNum(num);
}
tag=qName;
}
@Override
public voidcharacters(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 voidendElement(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()throws SAXException {
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 {
publicList<Person> parseXml(InputStream inputStream) {
List<Person> personList=newArrayList<Person>();
//获取解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=null;
MyDealHandler handler=null;
try {
//获取解析器
parser = factory.newSAXParser();
handler=newMyDealHandler();
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=newMySaxParse();//获取解析器对象
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);//调用解析器得到结果