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

Android Pull解析XML

2017-06-12 12:02 381 查看

Pull解析xml文件

先自己写一个xml文件,存一些天气信息

拿到xml文件

InputStream is = getClassLoader().getResourceAsStream("weather.xml");


拿到pull解析器

XmlPullParser xp = Xml.newPullParser();


开始解析

拿到指针所在当前节点的事件类型

int type = xp.getEventType();


事件类型主要有五种

START_DOCUMENT:xml头的事件类型

END_DOCUMENT:xml尾的事件类型

START_TAG:开始节点的事件类型

END_TAG:结束节点的事件类型

TEXT:文本节点的事件类型

如果获取到的事件类型不是END_DOCUMENT,就说明解析还没有完成,如果是,解析完成,while循环结束

while(type != XmlPullParser.END_DOCUMENT)


当我们解析到不同节点时,需要进行不同的操作,所以判断一下当前节点的name

当解析到weather的开始节点时,new出list

当解析到city的开始节点时,创建city对象,创建对象是为了更方便的保存即将解析到的文本

当解析到name开始节点时,获取下一个节点的文本内容,temp、pm也是一样

case XmlPullParser.START_TAG:
//获取当前节点的名字
if("weather".equals(xp.getName())){
citys = new ArrayList<City>();
}
else if("city".equals(xp.getName())){
city = new City();
}
else if("name".equals(xp.getName())){
//获取当前节点的下一个节点的文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
String temp = xp.nextText();
city.setTemp(temp);
}
else if("pm".equals(xp.getName())){
String pm = xp.nextText();
city.setPm(pm);
}
break;


当解析到city的结束节点时,说明city的三个子节点已经全部解析完了,把city对象添加至list

case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
citys.add(city);
}


weather.xml: 放于src目录下

<?xml version="1.0" encoding="utf-8"?>
<weather>
<city>
<name>上海&l
4000
t;/name>
<temp>23°</temp>
<pm25>40</pm25>
</city>
<city>
<name>深圳</name>
<temp>26°</temp>
<pm25>100</pm25>
</city>
<city>
<name>北京</name>
<temp>28°</temp>
<pm25>800</pm25>
</city>
</weather>


public class City {

private String name;
private String temp;
private String pm25;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getPm25() {
return pm25;
}
public void setPm25(String pm25) {
this.pm25 = pm25;
}
@Override
public String toString() {
return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";
}

}


public class MainActivity extends Activity {

List<City> cityList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

public void click(View v){
//获取天气信息xml文件
InputStream is = getClassLoader().getResourceAsStream("weather.xml");

//获取xmlpull解析器
XmlPullParser xp = Xml.newPullParser();
try {
//初始化
xp.setInput(is, "gbk");

//获取当前节点的事件类型
int type = xp.getEventType();City city = null;
while(type != XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//获取当前节点的名字
if("weather".equals(xp.getName())){
cityList = new ArrayList<City>();
}
else if("city".equals(xp.getName())){
city = new City();
}
else if("name".equals(xp.getName())){
//获取下一个节点的文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
//获取下一个节点的文本,把指针移动至当前节点的结束节点
String temp = xp.nextText();
city.setTemp(temp);
}
else if("pm25".equals(xp.getName())){
//获取下一个节点的文本
String pm25 = xp.nextText();
city.setPm25(pm25);
}
break;
case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
cityList.add(city);
}
break;

}
//把指针移动至下一个节点,并返回该节点的事件类型
type = xp.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for (City city : cityList) {
System.out.println(city.toString());
}
}

}


参考:Android数据解析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: