在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;
}
}