第一步 创建一个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 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()); } } }