先看一下要解析的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<person id="1" sex="m">
<name>zhangsan</name>
<age>32</age>
<adds>
<add code="home">home add</add>
<add code="com">com add</add>
</adds>
</person>
<person id="2" sex="w">
<name>lisi</name>
<age>22</age>
<adds>
<add code="home">home add</add>
<add code="com">com add</add>
</adds>
</person>
</doc>
SAX解析XML的完整流程 :
1. 编写一个class 继承DefaultHandler ,重写里面的5个方法 用来解析XML
public class xmlParse extends DefaultHandler {
private Person person;
private List<Person> list;
private String CurrentTag=null;
private String code;
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
// 解析文档前的准备工作
list = new ArrayList<Person>();
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
for(Person person:list){
System.out.println(person.toString());
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// 只要碰到元素节点不管是有属性 没属性 有文本 没文本的 就会调用这个方法。若是碰到了文本节点 就会触发characters()
if("person".equals(localName)){
person = new Person();
person.setID(attributes.getValue(0));
person.setSex(attributes.getValue("sex"));// attributes.getValue()的两种写法
}
else if("add".equals(localName)){
code = attributes.getValue(0);
}
CurrentTag = localName; // 解析的当前节点
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if("person".equals(localName)){
list.add(person);
person = null;
}
CurrentTag = null; //节点结束时制空 让它碰到空格的时候就会不调用characters
code = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if(CurrentTag!=null){ // 为null 就说明碰到了空格 当前没有元素
String content = new String(ch,start,length);
if("name".equals(CurrentTag)){
person.setName(content);
}
else if("age".equals(CurrentTag)){
person.setAge(content);
}
else if("add".equals(CurrentTag)){
if("home".equals(code)){
person.setHome(content);
}
else if("com".equals(code)){
person.setCom(content);
}
}
}
}
}
2. 在主程序里面开始解析我们的文档吧:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxParseService handler = new SaxParseService();
parser.parse(xmlStream, handler);
其中的xmlStream 可以从网络获取 也可以从assets获取:InputStream is = getAssets().open("test.xml");