您的位置:首页 > 移动开发 > Android开发

android xml解析之PULL解析

2011-11-23 10:47 369 查看
最近项目刚好用到这个,就学习了下,网上有很多教程,我也是把学习的过程记录在这里。

xml解析,我看了大概有三种方法,dom解析,sax解析和pull解析。这里,我介绍下pull解析方法。

pull解析方式是趋于事件驱动的,读取xml返回的是数字。

基本标签为:

读取到xml的声明返回 START_DOCUMENT;

读取到xml的结束返回 END_DOCUMENT ;

读取到xml的开始标签返回 START_TAG ;

读取到xml的结束标签返回 END_TAG ;

读取到xml的文本返回 TEXT;

返回的都是int类型。

好吧,下面还是看代码吧。首先得有一个xml,简单弄一个。

<locations>
<location name="北京" code="001">
<area>1290</area>
<url>http://www.beijing.com</url>
</location>
<location name="南京" code="002">
<area>1090</area>
<url>http://www.nanjing.com</url>
</location>
<location name="上海" code="003">
<area>2290</area>
<url>http://www.shanghai.com</url>
</location>
<location name="武汉" code="004">
<area>1292</area>
<url>http://www.wuhan.com</url>
</location>
</locations>


然后我们可以建一个对象,用来保存属性数据。比图:location类如下:

public class Location {
public String name;
public String code;
public String area;
public String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}

}


其实根据上面标签的意思,我们大概也能猜到,pull解析的工作原理。简单来说,就是遇到什么标签,执行什么结果。我们在代码里看:

pull解析方法:

public List<Location> parse(String path){
Log.i("parse", "parse");
List<Location> locations = new ArrayList<Location>();
Location location = null;
InputStream in = null;
//解析器
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
//文件流
in = getResources().getAssets().open(path);//xml文件放在assets里的,所以用这样的方法,如果放在其他文件夹,则改下。
Log.i("in", ""+in.read()+"----"+path);
//设置编码
parser.setInput(in, "utf-8");
Log.i("parser", parser.getText()+"ccc");
//获得解析事件的类别,这里有开始文档,结束文档。。。。
int evenType = parser.getEventType();

//循环,知道结束
while(evenType != XmlPullParser.END_DOCUMENT){
Log.i("evenType", ""+evenType);
switch(evenType){
case XmlPullParser.START_TAG:
String tag = parser.getName();
System.out.print("tag"+tag);
//如果是loacation标签,则要开始了,实例化对象
if(tag.equalsIgnoreCase("location")){
location = new Location();
location.setName(parser.getAttributeValue(null , "name"));
location.setCode(parser.getAttributeValue(null , "code"));
}else if(location != null){
//读取内部标签的内容
if(tag.equalsIgnoreCase("area")){
location.setArea(parser.nextText);
}else if(tag.equalsIgnoreCase("url")){
location.setUrl(parser.nextText());
//							Log.i("url", parser.nextText());//如果需要打印出数据,千万不能这样打印,因为之前以前next了,你打印的时候再用next,就报错了。(这是我遇到的,你可能不会这么傻的。-_-)
}
}
break;
//结束标签
case XmlPullParser.END_TAG:
if(parser.getName().equalsIgnoreCase("location") && location !=null){
locations.add(location);//加入list中
plocation = null;
}
break;
default:break;
}
//如果xml没有结束,则导航到下一个river节点.这个一点不能漏了哦。
evenType=parser.next();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return locations;
}


好了,返回的locations里面已经有我们需要的值了。保存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: