第一步 创建一个Person类存放相关信息
package com.xiaoxin.xml.bean;
public class Person{
private Integer id;
private String name;
private Short age;
public Person() {
super();
}
public Person(Integer id, String name, Short age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person(String name, Short age) {
super();
this.name = name;
this.age = 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 + "]";
}
}
第二步 新建一个类继承DefultHandle而DefultHandle实现了controlHandle的接口 controlHandle提供了相关的事件方法 然后在其中覆盖
startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作
startElement() 当开始解析元素的开始标签的时候,就会触发这个事件
characters() 当读到文本元素的时候要触发这个事件.
endElement() 当读到结束标签的时候 就会触发这个事件
先看 XML文件吧,好对SAX读取的顺序有个了解
<?xml version="1.0" encoding="utf-8"?>
<span style="white-space:pre"> </span><person>
<person id="23" >
<name>
NEwii
</name>
<age>
21
</age>
</person>
<person id="20" >
<name>
WiiWill
</name>
<age>
25
</age>
</person>
</person>
package com.xiaoxin.xml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
import com.xiaoxin.xml.bean.Person;
public class Sax extends DefaultHandler {
private static final String TAG="Sax";
//用一个集合存放解析东西
private List<Person>persons;
private String perTag;//通过此变量 ,记录前一个标签的名称
Person person;//记录当前Person
public List<Person>getPersons(){
return persons;
}
@Override
public void startDocument() throws SAXException {
persons=new ArrayList<Person>();
Log.i(TAG, "开始解析了");
super.startDocument();
}
/* (non-Javadoc)
* uri命名空间
* localName 标签名称
* qName 戴明明空间的标签名
* attributes 存放该标签的所有属性
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//首先判断是不是我们想要的元素
if("person".equals(localName)){
for(int i=0;i<attributes.getLength();i++){
<span style="white-space:pre"> </span>Log.i(TAG, "attributesName:"+attributes.getLocalName(i)+"attributes_value"+attributes.getValue(i));
//需要处理的一个对象的开始标记 所以我们在这里需要new一个person对象
person=new Person();
person.setId(Integer.valueOf(attributes.getValue(i)));
}
}
perTag=localName;
Log.i(TAG, "****startElement");
}
/* (non-Javadoc)
* ch 当前读到Textnode字节数组
* start 直接开始的位置
* lengh textnode的长度
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String data=new String(ch,start,length).trim();
if(!"".equals(data.trim())){
Log.i(TAG,"content:"+data.trim());
}
if("name".equals(perTag)){
person.setName(data);
}else if("age".equals(perTag)){
person.setAge(new Short(data));
}
}
@Override
public void endDocument() throws SAXException {
Log.i(TAG,"********endDocument()******");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG,qName+"******endElement()**");
if("person".equals(localName)){
persons.add(person);
person=null;
}
perTag=null;
}
}
然后在配置文件中 配置 测试单元
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaoxin.xml"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 增加测试单员 -->
<uses-library android:name="android.test.runner" />
<activity
android:name="com.xiaoxin.xml.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>
<!-- 增加测试单员 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.xiaoxin.xml" >
</instrumentation>
</manifest>
测试单员
package com.xiaoxin.xml;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.xiaoxin.xml.bean.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{
//因为XML在src文件中 可以直接反射到路径 inputStream
InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("xiaoxin.xml");
Sax sax=new Sax();
//建立解析工厂
SAXParserFactory spf=SAXParserFactory.newInstance();
//简历解析模式
SAXParser saxParser=spf.newSAXParser();
//导入路径 和解析方法 开始
saxParser.parse(inputStream, sax);
List<Person>persons=sax.getPersons();
inputStream.close();
for(Person person:persons){
Log.i(TAG, person.toString());
}
}
}