package com.xiaoxin.xml.Pull;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.xiaoxin.xml.bean.Person;
/**
* 一个接口,一个例外,一个工厂组成了pull解析器
* 调用parser.next()进入下一个元素并触发相应事件
* @author Administrator
*
*/
public class PullPersonService {
public static List<Person> getPersons(InputStream inputStream)throws Exception{
//这是清空的意思么
Person person=null;
//清空数组?
List<Person> persons=null;
//创立pull解析器
XmlPullParser pullParser=Xml.newPullParser();
//以UTF-8的编码导入
pullParser.setInput(inputStream,"utf-8");
//其结果是数字
int event = pullParser.getEventType();//触发第一个事件
while(event!=XmlPullParser.END_DOCUMENT){
switch (event) {
//开始解析
case XmlPullParser.START_DOCUMENT:
//用数组的形式开始接受
persons=new ArrayList<Person>();
break;
//开始元素
case XmlPullParser.START_TAG:
//如果解析的第一个事件名字是person
if("person".equals(pullParser.getName())){
//将其ID 变成0
int id = new Integer(pullParser.getAttributeValue(0));
person=new Person();
person.setId(id);
}
if(person!=null){
//如果不为空 将其name设置
if("name".equals(pullParser.getName())){
person.setName(pullParser.nextText());
}
//将其age设置
if("person".equals(pullParser.getName())){
person.setAge(new Short(pullParser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullParser.getName())){
//将业务bean添加到集合的中
persons.add(person);
//清空业务
person=null;
}
break;
}
//进行下一步
event=pullParser.next();
}
return persons;
}
}
<?xml version="1.0" encoding="utf-8"?>
<person>
<!-- 先进行检测这一行 -->
<person id="23" >
<name>
NEwii
</name>
<age>
21
</age>
</person>
<!-- 检测完了 将业务bean person.java清空,并进行next操作 -->
<person id="20" >
<name>
WiiWill
</name>
<age>
25
</age>
</person>
</person>
测试单元 代码
package com.xiaoxin.xml.Pull;
import java.io.InputStream;
import java.util.List;
import com.xiaoxin.xml.DOM.Dom;
import com.xiaoxin.xml.bean.Person;
import android.test.AndroidTestCase;
import android.util.Log;
public class PullServiceTest extends AndroidTestCase {
private static final String TAG = "PullServiceTest";
public void testPull() throws Throwable {
// 因为XML在src文件中 可以直接反射到路径 inputStream
InputStream inputStream = this.getClass().getClassLoader()
.getResourceAsStream("xiaoxin.xml");
List<Person>persons=PullPersonService.getPersons(inputStream);
for(Person person:persons){
Log.i(TAG, person.toString());
}
}
}
总结:有着sax的解析器的性能。可在编码上有没有sax的那么繁琐。同时也没有DOM繁琐的树状结构