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繁琐的树状结构