上一章讲了一下如何生成一个xml文件,这一节想跟大家分享一下如何解析一个xml文件,要解析一个xml文件,要用到一个解析器XmlPullParser.
这里我用一个简单的天气预报的小程序来说明如何解析xml文件。
这是代码目录:
这是我自己随便写的一个xml文件:
<?xml version="1.0" encoding="utf-8"?>
<infos>
<city id="1">
<temp>20C/30C</temp>
<weather>11月7号 晴</weather>
<wind>南风1~3级</wind>
<name>上海</name>
<pm>200</pm>
</city>
<city id="2">
<temp>10C/20C</temp>
<weather>11月7号 晴</weather>
<wind>北风5~6级</wind>
<name>北京</name>
<pm>800</pm>
</city>
<city id="3">
<temp>0C/10C</temp>
<weather>11月7号 晴</weather>
<wind>东风7~8级</wind>
<name>哈尔滨</name>
<pm>100</pm>
</city>
</infos>
activity_main.xml此文件没改什么
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="106dp"
android:text="@string/hello_world" />
</RelativeLayout>
AndroidManifest.xml也没改:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.leo.weather"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.leo.weather.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
下面来看java文件:
package com.leo.weather;
import java.util.List;
import com.leo.weather.domain.WeatherInfo;
import com.leo.weather.service.WeatherService;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);//一个textview控件,用来显示所获取的内容
try {
//获得WeatherService 的getWeatherInfos方法所得到的内容,保存在list里。
List<WeatherInfo> infos = WeatherService.getWeatherInfos(MainActivity.class.getClassLoader()
.getResourceAsStream("weather.xml"));
StringBuffer sb = new StringBuffer();
//遍历list,取得每一个对像的内容,然后添加到StringBuffer 里
for(WeatherInfo info :infos){
String str = info.toString();
sb.append(str);
sb.append("\n");
}
//将StringBuffer 里的内容toString 后显示在控件中
tv.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "解析文件失败!", 0).show();
}
}
}
package com.leo.weather.domain;
public class WeatherInfo {
private int id;
private String name;
private String wind;
private String weather;
private String temp;
private String pm;
@Override
public String toString() {
return "[城市id=" + id + ", 名称=" + name + ", 风力=" + wind
+ ", 天气情况=" + weather + ", 温度=" + temp + ", PM2.5=" + pm
+ "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getPm() {
return pm;
}
public void setPm(String pm) {
this.pm = pm;
}
}
最重要的文件:解析过程全在这个文件里:
package com.leo.weather.service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.leo.weather.domain.WeatherInfo;
public class WeatherService {
public static List<WeatherInfo> getWeatherInfos(InputStream is) throws Exception{
//获得xmlpullparser解析器
XmlPullParser parser = Xml.newPullParser();
//对文件流设置编码方式
parser.setInput(is,"utf-8");
//list用来存从文件流所获取的信息 city对像
List<WeatherInfo> weatherInfos = null;
WeatherInfo weatherInfo = null;
//获得解析到的事件类型,这里有开始文档,结束文档,开始标签,结束标签,文本等事件。
int type = parser.getEventType();
//一直循环,直到文档结束
while(type != XmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_TAG:
if("infos".equals(parser.getName())){
//解析到全局开始的标签
weatherInfos = new ArrayList<WeatherInfo>();
}else if("city".equals(parser.getName())){ //如果是city标签开始,则说明要实例化对像,并通过set方法来设置其属性值。
weatherInfo = new WeatherInfo();
String idStr = parser.getAttributeValue(0);
weatherInfo.setId(Integer.parseInt(idStr));
}else if("temp".equals(parser.getName())){
String tempStr = parser.nextText();
weatherInfo.setTemp(tempStr);
}else if("weather".equals(parser.getName())){
String weatherStr = parser.nextText();
weatherInfo.setWeather(weatherStr);
}else if("wind".equals(parser.getName())){
String windStr = parser.nextText();
weatherInfo.setWind(windStr);
}else if("name".equals(parser.getName())){
String nameStr = parser.nextText();
weatherInfo.setName(nameStr);
}else if("pm".equals(parser.getName())){
String pmStr = parser.nextText();
weatherInfo.setPm(pmStr);
}
break;
case XmlPullParser.END_TAG:
//若遇到city标签结束 ,则把city对像添加进集合中
if("city".equals(parser.getName())){
weatherInfos.add(weatherInfo);
weatherInfo = null;
}
break;
}
//如果xml没有结束,则继续到下一个city节点
type = parser.next();
}
return weatherInfos;
}
}