在Android平台上可以使用SAX、 DOM和Android附带的pull解析器解析XML文件。android系统推荐使用pull解析,pull解析是轻量级解析,在android的内核中已经嵌入了pull,所以不需导入第三方jar包。以下讲解的是使用pull解析器来解析XML文件的实例。
1,下面是本例子要解析的XML文件city.xml(把此文件拷贝到src目录下):
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8" standalong="yes"?>
<weather>
<city>
<name>北京</name>
<temp>6*</temp>
<pm2.5>300</pm2.5>
</city>
<city>
<name>上海</name>
<temp>15*</temp>
<pm2.5>30</pm2.5>
</city>
<city>
<name>深圳</name>
<temp>16*</temp>
<pm2.5>30</pm2.5>
</city>
</weather></span>
2,创建解析后数据要封装到的javabean对象:
<span style="font-size:18px;">package com.example.pull.domain;
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 type) {
this.temp = temp;
}
public String getPm25() {
return pm25;
}
public void setPm25(String pm25) {
this.pm25 = pm25;
}
public City() {
super();
}
public City(String name, String temp, String pm25) {
super();
this.name = name;
this.temp = temp;
this.pm25 = pm25;
}
@Override
public String toString() {
return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";
}
}</span>
3,使用pull解析器解析city.xml对象:
<span style="font-size:18px;">public class MainActivity extends Activity {
private List<City> cityList;
private City city;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
}
// 解析xml文件
public void doClick(View v) {
// 1,通过类加载器来拿到资源文件
InputStream is = getClassLoader().getResourceAsStream("city.xml");
// 2,拿到解析器对象
XmlPullParser parser = Xml.newPullParser();
try {
// 3,初始化解析器对象
parser.setInput(is, "utf-8");
// 4,开始解析
// 获取当前节点的事件类型(相当于指针)
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if ("weather".equals(parser.getName())) {
// 解析到开始节点(weather)时,初始化集合对象
cityList = new ArrayList<City>();
} else if ("city".equals(parser.getName())) {
// 解析到"city"节点时,初始化city对象
city = new City();
}
// 解析"city"中的"name"
else if ("name".equals(parser.getName())) {
// 获取当前节点的下一个节点的文本
String name = parser.nextText();
city.setName(name);
}
// 解析"city"中的"temp"
else if ("temp".equals(parser.getName())) {
// 获取当前节点的下一个节点的文本
String temp = parser.nextText();
city.setTemp(temp);
}
// 解析"city"中的"pm25"
else if ("pm25".equals(parser.getName())) {
// 获取当前节点的下一个节点的文本
String pm25 = parser.nextText();
city.setPm25(pm25);
}
break;
case XmlPullParser.END_TAG:
// 如果结束节点为“city”,把此city对象存入到集合中
if ("city".equals(parser.getName())) {
cityList.add(city);
}
break;
}
// 当前节点解析后,指针下移,解析下一个节点
type = parser.next();
}
// 打印输出解析的文件
for (City city : cityList) {
System.out.println(city.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}</span>
友情提示:如果是在java或JavaEE中使用pull解析xml文件,需要额外导入支持pull解析的第三方jar包。