SAX(simpleAPIforXML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。
在用Sax解析xml文档的时候不要忽略节点之间的空白字符串。
下面来实例看看如何使用Sax解析下面的Xml:
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<persons>
<person id="1">
<name>范冰冰</name>
<age>31</age>
</person>
<person id="2">
<name>林志玲</name>
<age>38</age>
</person>
<person id="3">
<name>杨幂</name>
<age>26</age>
</person>
</persons>
1.首先写一个java类,继承DefaultHandler类
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxXML extends DefaultHandler {
private Person person;
private List<Person> list;
private String currentTag; //用来保存当前节点名
public List<Person> getPersonList(){
return list;
}
//文档开始调用 只调用一次
@Override
public void startDocument() throws SAXException {
list=new ArrayList<Person>();
}
//开始一个节点调用
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("person")){
person=new Person();
person.setId(Integer.parseInt(attributes.getValue(0)));
}
currentTag=qName;
}
//读取到文本时调用
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(currentTag!=null){ //先判断当前节点不为空才开始操作
String content=new String(ch,start,length);
if(currentTag.equals("name")){
person.setName(content);
}else if(currentTag.equals("age")){
person.setAge(Integer.parseInt(content));
}
}
}
//结束一个节点时调用
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("person")){
list.add(person);
person=null;
}
currentTag=null; //一个节点结束必须置空,否则将读取到节点后面的空字符串
}
//结束文档时调用,只调用一次
@Override
public void endDocument() throws SAXException {
}
}
2.然后写一个test方法,解析xml文件,输出结果
package cn.itcast.xml;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import android.test.AndroidTestCase;
public class PersonTest extends AndroidTestCase {
public void SaxXMLTest() throws Exception {
// 构建SAXParser
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
// 实例化 DefaultHandler对象
SaxXML handler = new SaxXML();
// 读取xml文件
InputStream in = PersonTest.class.getClassLoader().getResourceAsStream("persons.xml");
//调用parse()方法,解析xml文档
parser.parse(in, handler);
//返回list
List<Person> persons = handler.getPersonList();
//打印结果
for (Person p : persons)
System.out.println(p);
}
}
输出结果如下: