Android开发8——利用pull解析器读写XML文件
一、基本介绍 对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml。xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自己获取xmlpull所依赖的类库,kxml2-2.3.0.jar,xmlpull_1_1_3_4c.jar。 jar包下载网址http://www.xmlpull.org/http://kxml.sourceforge.net/ 二、例子 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 END_DOCUMENT ; 读取到xml的开始标签返回数字2 START_TAG 读取到xml的结束标签返回数字3 END_TAG 读取到xml的文本返回数字4 TEXT <?xmlversion="1.0"encoding="UTF-8"?> <people> <personid="001"> <name>XY1</name> <age>22</age> </person> <personid="002"> <name>XY2</name> <age>22</age> </person> </people> packagecn.xy.service; importjava.io.InputStream; importjava.io.OutputStream; importjava.util.ArrayList; importjava.util.List; importorg.xmlpull.v1.XmlPullParser; importorg.xmlpull.v1.XmlSerializer; importandroid.util.Xml; importcn.xy.model.Person; publicclassPersonService { publicListgetPeople(InputStreamxml)throwsException { Listlst=null; Personperson=null; //利用ANDROID提供的API快速获得pull解析器 XmlPullParserpullParser=Xml.newPullParser(); //设置需要解析的XML数据 pullParser.setInput(xml,"UTF-8"); //取得事件 intevent=pullParser.getEventType(); //若为解析到末尾 while(event!=XmlPullParser.END_DOCUMENT)//文档结束 { StringnodeName=pullParser.getName(); switch(event) { caseXmlPullParser.START_DOCUMENT://文档开始 lst=newArrayList(); break; caseXmlPullParser.START_TAG://标签开始 if("person".equals(nodeName)) { Stringid=pullParser.getAttributeValue(0); person=newPerson(); person.setId(id); } if("name".equals(nodeName)) { Stringname=pullParser.nextText(); person.setName(name); } if("age".equals(nodeName)) { intage=Integer.valueOf(pullParser.nextText()); person.setAge(age); } break; caseXmlPullParser.END_TAG://标签结束 if("person".equals(nodeName)) { lst.add(person); person=null; } break; } event=pullParser.next();//下一个标签 } returnlst; } publicvoidsaveDataToXML(OutputStreamos,Listlst)throwsException { XmlSerializerxs=Xml.newSerializer(); xs.setOutput(os,"UTF-8"); xs.startDocument("UTF-8",true); xs.startTag(null,"people"); for(Personp:lst) { xs.startTag(null,"person"); xs.attribute(null,"person",p.getId()); xs.startTag(null,"name"); xs.text(p.getName()); xs.endTag(null,"name"); xs.startTag(null,"age"); xs.text(p.getAge().toString()); xs.endTag(null,"age"); xs.endTag(null,"person"); } xs.endTag(null,"people"); xs.endDocument(); os.flush(); os.close(); } } publicclassTestClassextendsAndroidTestCase { publicvoidtestPeople()throwsException { PersonServiceps=newPersonService(); InputStreamxml=this.getClass().getClassLoader().getResourceAsStream("person.xml"); Listlst=ps.getPeople(xml); Assert.assertEquals("XY1",lst.get(0).getName()); } publicvoidtestSave()throwsException { PersonServiceps=newPersonService(); Listlst=newArrayList(); lst.add(newPerson("0001","XY0001",20)); lst.add(newPerson("0002","XY0002",20)); FilexmlFile=newFile(this.getContext().getFilesDir(),"xy.xml");//data/data/packagename/files OutputStreamos=newFileOutputStream(xmlFile); ps.saveDataToXML(os,lst); } } 本文参考自金旭亮老师的《.NET 4.0面向对象编程漫谈》有关代理的内容 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1079595如需转载请自行联系原作者 woshixuye111