几种XML解析方式
xml解析方式 | 特点 |
---|
DOM解析 | 加载到内存,生成树状结构,消耗内存较大 |
SAX解析 | 基于事件的方式,效率高,不能回退 |
Pull解析 | 类似SAX解析,用于安卓平台 |
XmlPullParser常用方法
XmlPullParser常用方法 | 说明 |
---|
setInput() | 设置输入流以初始化对象 |
getEventType() | 获取当前事件(xml标记)类型 |
getName() | 获取当前标签名 |
getAttributeValue() | 获取当前标签属性值 |
nextText() | 获取标签后的文本 |
next() | 处理下一个事件(xml标记) |
EventType常量
getEventType返回事件类型(int),对应如下表
EventType常量 | 值 |
---|
START_DOCUMENT | 0 |
END_DOCUMENT | 1 |
START_TAG | 2 |
END_TAG | 3 |
TEXT | 4 |
… | … |
XmlPullParser代码实现
public class WeatherService {
public static List<WeatherInfos> getWeatherInfos(InputStream is) throws Exception{
List<WeatherInfos> InfosList = null;
WeatherInfos infos = null;
XmlPullParser xpp = Xml.newPullParser();
xpp.setInput(is,"utf-8");
int type = xpp.getEventType();
while(type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if(xpp.getName().equals("infos")) {
InfosList = new ArrayList<WeatherInfos>();
}
else if(xpp.getName().equals("city")){
infos = new WeatherInfos();
infos.setId(Integer.valueOf(xpp.getAttributeValue(0)));
}
else if(xpp.getName().equals("temp")) {
infos.setTemp(xpp.nextText());
}
else if(xpp.getName().equals("weather")) {
infos.setWeather(xpp.nextText());
}
else if(xpp.getName().equals("wind")) {
infos.setWind(xpp.nextText());
}
else if(xpp.getName().equals("name")) {
infos.setName(xpp.nextText());
}
else if(xpp.getName().equals("pm")) {
infos.setPm(Integer.valueOf(xpp.nextText()));
}
break;
case XmlPullParser.END_TAG:
InfosList.add(infos);
infos=null;
break;
}
xpp.next();
type=xpp.getEventType();
}
return InfosList;
}
}
通过类加载器加载资源
文件应当放在scr下
MainActivity.class.getClassLoader().getResourceAsStream("weather.xml")
*加载weather.xml
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
InputStream is = this.getClassLoader().getResourceAsStream("weather.xml");
InfosList = WeatherService.getWeatherInfos(is);
Toast.makeText(this, "解析完毕", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(this, "解析失败", Toast.LENGTH_SHORT).show();
}
}
*weather.xml
<?xml version="1.0" encoding="utf-8"?>
<infos>
<city id="0">
<temp>20-30</temp>
<weather>sunny</weather>
<wind>3-4</wind>
<name>上海</name>
<pm>70</pm>
</city>
<city id="1">
<temp>25-30</temp>
<weather>rainy</weather>
<wind>4-5</wind>
<name>北京</name>
<pm>200</pm>
</city>
<city id="2">
<temp>10-20</temp>
<weather>snowy</weather>
<wind>7-8</wind>
<name>哈尔滨</name>
<pm>100</pm>
</city>
</infos>