Android学习--使用Pull解析器读取XML文件、将对象写入XML文件
笔记摘要:
这里介绍了一种XML文件的另一种解析方式,在Android中已经集成,应用比较广泛,同时我们可以使用Pull解析器对对象进行序列化,写入到Xml文件中。
一、Pull解析器方式的介绍
除了可以使用SAX或DOM解析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 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; } @Override public 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文件 } }