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); } }
输出结果如下: