- /*
- SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:
- startDocument()
- 当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
- endDocument()
- 和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
- startElement(String namespaceURI, String localName, String qName, Attributes atts)
- 当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。
- endElement(String uri, String localName, String name)
- 这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。
- characters(char[] ch, int start, int length)
- 这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
- */
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="23">
- <name>zhangsan</name>
- <age>25</age>
- </person>
- <person id="20">
- <name>lisi</name>
- <age>28</age>
- </person>
- </persons>
- package com.zyq.xml;
- import java.io.InputStream;
- import java.util.List;
- import com.zyq.service.SAXPersonService;
- import com.zyq.voo.Person;
- import android.test.AndroidTestCase;
- import android.util.Log;
- public class PersonServiceTest extends AndroidTestCase
- {
- private static final String TAG="PersonServiceTest";
- public void testSAX() throws Throwable
- {
- SAXPersonService personService=new SAXPersonService();
- InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("person.xml");
- List<Person> persons=personService.getPersons(inputStream);
- for(Person person : persons)
- {
- Log.i(TAG, person.toString());
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.zyq.xml"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <uses-library android:name="android.test.runner" />
- <activity android:name=".MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="8" />
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.zyq.xml" android:label="Tests for My App" />
- </manifest>
- package com.zyq.voo;
- public class Person
- {
- private Integer id;
- private String name;
- private Short age;
- public Integer getId()
- {
- return id;
- }
- public void setId(Integer id)
- {
- this.id = id;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public Short getAge()
- {
- return age;
- }
- public void setAge(Short age)
- {
- this.age = age;
- }
- @Override
- public String toString()
- {
- return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
- }
- }
- package com.zyq.service;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- import com.zyq.voo.Person;
- public class SAXPersonService
- {
- /**
- * SAX解析person.xml
- * @param inputStream person.xml数据
- * @return persons
- * @throws Throwable
- */
- public List<Person> getPersons(InputStream inputStream) throws Throwable
- {
- SAXParserFactory factory=SAXParserFactory.newInstance();
- SAXParser parser=factory.newSAXParser();
- PersonHandel personHandel=new PersonHandel();
- parser.parse(inputStream, personHandel);
- return personHandel.getPersons();
- }
- private class PersonHandel extends DefaultHandler
- {
- private List<Person> persons;
- private String preTAG;
- private Person person;
- public List<Person> getPersons()
- {
- return persons;
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException
- {
- if(preTAG!=null)
- {
- String data=new String(ch, start, length);
- if("name".equals(preTAG))
- {
- person.setName(data);
- }
- else if("age".equals(preTAG))
- {
- person.setAge(new Short(data));
- }
- }
- }
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException
- {
- if("person".equals(localName))
- {
- person=new Person();
- Integer id= new Integer(attributes.getValue(0));
- person.setId(id);
- }
- preTAG=localName;
- }
- @Override
- public void startDocument() throws SAXException
- {
- persons=new ArrayList<Person>();
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException
- {
- if("person".equals(localName))
- {
- persons.add(person);
- person=null;
- }
- preTAG=null;
- }
- }
- }