XML解析和生成之--pull(android内置)
Pull是Android内置的xml解析器。Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
下面我们来写代码学习pull解析技术。
要解析的xml文件名为:target.xml,解析的内容如下:
Xml代码- <?xmlversion="1.0"encoding="UTF-8"?>
- <persons>
- <personid="23">
- <name>liming</name>
- <age>30</age>
- </person>
- <personid="20">
- <name>lixiangmei</name>
- <age>25</age>
- </person>
- </persons>
同样,我们在android的工程下写代码测试,使用android的单元测试技术进行测试,当然测试类还要继承AndroidTestCase
在layout/res/AndroidManifest.xml文件下添加单元测试所需要的代码:
在AndroidManifest.xml文件的application节点下添加以下代码:
Xml代码- <uses-libraryandroid:name="android.test.runner"/>
在AndroidManifest.xml文件的manifest节点下添加以下代码:
Xml代码- <instrumentationandroid:name="android.test.InstrumentationTestRunner"android:targetPackage="你的测试文件所在的包名"android:label="TestsforMyApp"/>
- publicclassPerson{
- privateIntegerid;
- privateStringname;
- privateShortage;
- publicPerson(){}//无参构造器
- publicPerson(Integerid,Stringname,Shortage){
- this.id=id;
- this.name=name;
- this.age=age;
- }
- publicIntegergetId(){
- returnid;
- }
- publicvoidsetId(Integerid){
- this.id=id;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicShortgetAge(){
- returnage;
- }
- publicvoidsetAge(Shortage){
- this.age=age;
- }
- @Override
- publicStringtoString(){
- return"Person[age="+age+",id="+id+",name="+name+"]";
- }
- }
pull解析的核心类:PULLPersonService.java,里面包含两个方法,一个是生成xml文件的方法,一个事解析xml文件的方法。
Java代码- /**
- *采用Pull解析XML内容
- */
- publicclassPULLPersonService{
- /**
- *使用pull技术生成xml文件
- *@parampersons
- *@paramwriter
- *@throwsThrowable
- */
- publicstaticvoidsave(List<Person>persons,Writerwriter)throwsThrowable{
- XmlSerializerserializer=Xml.newSerializer();
- serializer.setOutput(writer);
- serializer.startDocument("UTF-8",true);
- serializer.startTag(null,"persons");
- for(Personperson: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();
- writer.flush();
- writer.close();
- }
- /**
- *使用pull技术解析xml
- *@paraminStream
- *@return
- *@throwsThrowable
- */
- publicstaticList<Person>getPersons(InputStreaminStream)throwsThrowable{
- List<Person>persons=null;
- Personperson=null;
- XmlPullParserparser=Xml.newPullParser();
- parser.setInput(inStream,"UTF-8");
- inteventType=parser.getEventType();//产生第一个事件
- while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
- switch(eventType){
- caseXmlPullParser.START_DOCUMENT:
- persons=newArrayList<Person>();
- break;
- caseXmlPullParser.START_TAG:
- Stringname=parser.getName();//获取解析器当前指向的元素的名称
- if("person".equals(name)){
- person=newPerson();
- person.setId(newInteger(parser.getAttributeValue(0)));
- }
- if(person!=null){
- if("name".equals(name)){
- person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
- }
- if("age".equals(name)){
- person.setAge(newShort(parser.nextText()));
- }
- }
- break;
- caseXmlPullParser.END_TAG:
- if("person".equals(parser.getName())){
- persons.add(person);
- person=null;
- }
- break;
- }
- eventType=parser.next();
- }
- returnpersons;
- }
- }
- publicclassPersonServiceTestextendsAndroidTestCase{
- privatestaticfinalStringTAG="PersonServiceTest";
- publicvoidtestPullGetPersons()throwsThrowable{
- InputStreaminStream=getClass().getClassLoader().getResourceAsStream("target.xml");
- List<Person>persons=PULLPersonService.getPersons(inStream);
- for(Personperson:persons){
- Log.i(TAG,person.toString());
- }
- }
- publicvoidtestSave()throwsThrowable{
- List<Person>persons=newArrayList<Person>();
- persons.add(newPerson(34,"lili",(short)12));
- persons.add(newPerson(25,"mimi",(short)32));
- persons.add(newPerson(33,"xixi",(short)40));
- StringWriterwriter=newStringWriter();
- PULLPersonService.save(persons,writer);
- Log.i(TAG,writer.toString());
- }
- }
public class PersonServiceTest extends AndroidTestCase {private static final String TAG = "PersonServiceTest";public void testPullGetPersons() throws Throwable{InputStream inStream = getClass().getClassLoader().getResourceAsStream("target.xml");List<Person> persons = PULLPersonService.getPersons(inStream);for(Person person : persons){Log.i(TAG, person.toString());}}public void testSave() throws Throwable{List<Person> persons = new ArrayList<Person>();persons.add(new Person(34, "lili", (short)12));persons.add(new Person(25, "mimi", (short)32));persons.add(new Person(33, "xixi", (short)40));StringWriter writer = new StringWriter();PULLPersonService.save(persons, writer);Log.i(TAG, writer.toString());}}
用单元测试运行testPullGetPersons()方法,运行结果如下:
Xml代码- Person[age=30,id=23,name=liming]
- Person[age=25,id=20,name=lixiangmei]
用单元测试运行 testSave()方法,运行结果如下:
Xml代码- <?xmlversion='1.0'encoding='UTF-8'standalone='yes'?>
- <persons>
- <personid="34">
- <name>lili</name>
- <age>12</age>
- </person>
- <personid="25">
- <name>mimi</name>
- <age>32</age>
- </person>
- <personid="33">
- <name>xixi</name>
- <age>40</age>
- </person>
- </persons>
到此完成了用pull技术完成xml的解析,和生成xml文件。
<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
更多相关文章
- Android多渠道打包之Python打包
- android中对sd卡文件的管理
- Mac OSX Android源码编译-环境搭建、源码下载、源码编译、导入An
- 如何实现在 Android(安卓)Studio 上开发系统应用(自带系统签名)
- gRPC在Android中的应用、配置、生成文件及登录实现
- Android(安卓)XML文件链接错误
- 【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite
- Android(安卓)Studio 新建一个简单的Jni-demo,实现了so库的生成与
- 【Android】【学习笔记】运行时资源替换-Runtime Resource Overl