在Android系统中解析XML文件的方法
前言
在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码。因此,这里也顺道介绍一下XmlPullParser的使用。
XML
XML(eXtensibleMarkupLanguage)中文名为可扩展标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
用途
XML设计用了传送及携带数据信息,不用了表现或展示数据,HTML语言则用了表现数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。
- 丰富文件——自定文件描述并使其更丰富
- 元数据——描述其它文件或网络资讯
- 配置文档——描述软件设置的参数
结构
每个XML文档都由XML序言开始,在前面的代码中第一行就是XML序言,<?xmlversion="1.0"?>。这一行代码会告诉解析器或浏览器这个文件应该按照XML规则进行解析。但是,根元素的名称是由文档类型定义或XML纲要定义的。
XmlPullParser
PULL解析xml是基于事件驱动的方式解析XML文件,pull开始解析时,我们可以先通过getEventType()方法获取当前解析事件类型,并且通过next()方法获取下一个解析事件类型。PULL解析器提供了START_DOCUMENT(开始文档)、END_DOCUMENT(结束文档)、START_TAG(开始标签)、END_TAG(结束标签)四种事件解析类型。当处于某个元素时,可以调用getAttributeValue()方法获取属性的值,也可以通过nextText()方法获取本节点的文本值。下面通过一个例子来进行解析。
xml示例文件
需要解析的xml示例文件代码如下:
<?xmlversion="1.0"encoding="UTF-8"?> <colleagues> <colleagueid="1"> <name>耗子</name> <age>24</age> <sex>boy</sex> </colleague> <colleagueid="2"> <name>璐璐</name> <age>28</age> <sex>girl</sex> </colleague> <colleagueid="3"> <name>陈善</name> <age>26</age> <sex>boy</sex> </colleague> </colleagues>
XmlPullParser解析器
packagecom.example.shakedemo; importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileReader; importjava.io.IOException; importjava.util.ArrayList; importjava.util.List; importorg.xmlpull.v1.XmlPullParser; importorg.xmlpull.v1.XmlPullParserException; importorg.xmlpull.v1.XmlPullParserFactory; importandroid.R.xml; importandroid.util.Log; importandroid.util.Xml; publicclassXmlPullParserHelper{ publicstaticList<Colleague>getColleagues(StringxmlFilePath){ List<Colleague>colleagues=newArrayList<Colleague>(); FileReaderxmlReader=null; try{ xmlReader=newFileReader(newFile(xmlFilePath)); }catch(FileNotFoundExceptione){ Log.e("wzy","Couldn'tfindxmlfile"+xmlFilePath); returncolleagues; } try{ //方式1:使用Android提供的android.util.Xml类获取parser对象 XmlPullParserparser=Xml.newPullParser(); //方式2:使用工厂类XmlPullParserFactory //XmlPullParserFactorypullFactory= //XmlPullParserFactory.newInstance(); //XmlPullParserparser=pullFactory.newPullParser(); //设置文件输入流 parser.setInput(xmlReader); //得到当前事件类型 inteventType=parser.getEventType(); Colleaguecolleague=null; while(eventType!=XmlPullParser.END_DOCUMENT){ switch(eventType){ caseXmlPullParser.START_DOCUMENT: break; caseXmlPullParser.START_TAG: /** *通过getName判断读到哪个标签,然后通过nextText获取文本节点值, *或者通过getAttributeValue(i)获取属性节点值 */ Stringname=parser.getName(); if("colleague".equals(name)){ colleague=newColleague(); colleague.setId(Integer.parseInt(parser.getAttributeValue(null,"id"))); }elseif("name".equals(name)){ if(colleague!=null){ colleague.setName(parser.nextText()); } }elseif("age".equals(name)){ if(colleague!=null){ colleague.setAge(Integer.parseInt(parser.nextText())); } }elseif("sex".equals(name)){ if(colleague!=null){ colleague.setSex(parser.nextText()); } } break; caseXmlPullParser.END_TAG: if("colleague".equals(parser.getName())&&colleague!=null){ colleagues.add(colleague); colleague=null; } break; } eventType=parser.next(); } xmlReader.close(); }catch(XmlPullParserExceptione){ //Donothing }catch(IOExceptione){ //Donothing } returncolleagues; } }
其中,colleague类的定义比较简单,代码如下:
packagecom.example.shakedemo; publicclassColleague{ privateintid; privateintage; privateStringname; privateStringsex; publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetSex(){ returnsex; } publicvoidsetSex(Stringsex){ this.sex=sex; } @Override publicStringtoString(){ return"IDis"+id+",Nameis"+name+",Sexis"+sex; } }