笔记摘要:

这里介绍了一种XML文件的另一种解析方式,在Android中已经集成,应用比较广泛,同时我们可以使用Pull解析器对对象进行序列化,写入到Xml文件中。


一、Pull解析器方式的介绍

除了可以使用SAXDOM解析XML文件之外,还可以使用Android内置的Pull解析器解析XML文件。Pull解析器是一个开源的java项目,既可以用于Android

也可以用于JavaEE。如果用在javaEE中,需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。Android系统本身使

用到的各种xml文件,其内部也是采用Pull解析器进行解析的。Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,

使用parser.next()可以进入系一个元素并触发相应事件。跟SAX不同的是Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件

进行处理,当元素开始解析时,调用parser.nextText()方法获取下一个Text类型节点的值。


二、代码演示

通过测试的方式对使用Pull解析器解析XML文档,并将集合中的对象写入到XML文档中进行演示,废话不多说,直接上代码


在AndroidMainfest.xml中配置测试环境

<uses-library android:name="android.test.runner"></uses-library>

<instrumentation android:targetPackage="cn.xushuai.pullparser"     android:name="android.test.InstrumentationTestRunner" ></instrumentation>


提供一个XML文件用于解析:

<?xml version="1.0" encoding="UTF-8"?><persons><person id = "001"><name>zhangsan</name><age>22</age></person><person id = "002"><name>lisi</name><age>23</age></person></persons>



有了对象当然需要一个JavaBean

package cn.xushuai.domain;public class Person {private String id;private Integer age;private String name;public Person(String id, String name,Integer age ) {super();this.id = id;this.age = age;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";}}

业务类:

1、解析XML文档

2、将集合中的对象写入到本地的XML文档

package cn.xushuai.service;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import android.util.Xml;import cn.xushuai.domain.Person;//读取XML文档public class PersonService {/*获取数据 * @param xml * @return  * @throws Exception * */public static List<Person> getPersons(InputStream xml)throws Exception{List<Person> persons = null;Person person = null;//获取Pull解析器的两种方式//XmlPullParser pullParser =  XmlPullParserFactory.newInstance().newPullParser();XmlPullParser pullParser = Xml.newPullParser();//使用Android提供的帮助类直接获取pullParser.setInput(xml,"UTF-8");//为pull解析器设置要解析的XML数据和编码int event = pullParser.getEventType();//获取触发事件类型while(event!= XmlPullParser.END_DOCUMENT){//没触发文件结束事件前一直读取switch (event) {case XmlPullParser.START_DOCUMENT://触发到文档开始事件时,进行初始化persons = new ArrayList<Person>();break;case XmlPullParser.START_TAG://触发开始标签事件if("person".equals(pullParser.getName())){String id = pullParser.getAttributeValue(0);person = new Person(null,null,null);//对象实例化person.setId(id);}if("name".equals(pullParser.getName())){String name = pullParser.nextText();//获取节点的内容,并设置属性值person.setName(name);}if("age".equals(pullParser.getName())){//int age = new Integer(pullParser.nextText());int age = Integer.valueOf(pullParser.nextText());person.setAge(age);}break;case XmlPullParser.END_TAG://触发结束标签事件if("person".equals(pullParser.getName())){//如果节点为person,将对象添加到集合中persons.add(person);person = null;}break;}event = pullParser.next();//使得解析器进行下一个节点,并触发事件,不调用则不会继续解析}return persons;//返回解析后的对象集合}/*保存数据 * @param persons 数据 * @param out 输出方向 * @throws Exception * */public static void save(List<Person> persons,OutputStream out)throws Exception{XmlSerializer serializer = Xml.newSerializer();//获取一个序列化器serializer.setOutput(out,"UTF-8");//设置输出流serializer.startDocument("UTF-8", true);//文件开始标志设置,true代表文件可独立存在//生成文档正文部分serializer.startTag(null, "persons");//设置开始元素节点,null:没有指定命名空间for(Person person : persons){serializer.startTag(null, "person");serializer.attribute(null,"id",person.getId().toString());//设置属性serializer.startTag(null, "name");serializer.text(person.getName());//设置文本内容serializer.endTag(null,"name");serializer.startTag(null, "age");serializer.text(person.getAge().toString());serializer.endTag(null,"age");serializer.endTag(null, "person");}serializer.endTag(null, "persons");//设置结束元素节点serializer.endDocument();//文件结束标志设置out.flush();//将数据刷出去,避免用户传入缓冲流导致效率慢out.close();}}



测试类

package cn.xushuai.test;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.test.AndroidTestCase;import android.util.Log;import cn.xushuai.domain.Person;import cn.xushuai.service.PersonService;public class PersonServiceTest extends AndroidTestCase{public static final String TAG = "PersonServiceTest";//定义一个标签,将对象以日志的信息输出public void testPerson()throws Exception{InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");//通过类加载器加载本地文件List<Person> persons = PersonService.getPersons(xml);//将XML中的数据封装成对象for(Person person : persons){Log.i(TAG,person.toString());//通过日志形式输出}}public void testSave()throws Exception{List<Person> persons = new ArrayList<Person>();//创建一个集合用于存储对象,用于写入XML文件中persons.add(new Person("005","hhaha",19));persons.add(new Person("006","sa",39));persons.add(new Person("007","lina",25));//将数据保存到当前应用所在包的files文件夹中File xmlFile = new File(getContext().getFilesDir(),"pullparser.xml");FileOutputStream fos = new FileOutputStream(xmlFile);PersonService.save(persons,fos);//将对象保存到XML文件}}


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)创建与解析XML(三)---- PULL方式
  6. Android学习笔记1 ——资源 (一)
  7. 如何提高Android代码的安全性
  8. Android运行时异常“Binary XML file line # : Error inflating
  9. Android学习【7】manifest文件讲解

随机推荐

  1. Android dumpsys cpuinfo 信息解读
  2. 【Android面试】Android面试题集锦 (陆续
  3. android 读取SD卡或者其他地方文件功能函
  4. android 用代码设置margin属性,textView加
  5. Android space控件:间隙留白
  6. Android使用继承View类来绘图
  7. android增删改查sqlite数据库
  8. Android的登陆MD5加密
  9. Android软键盘之代码改变软键盘状态
  10. 【Android】让你的对话框炫起来!漂亮动画