android解析xml文件之XmlPullParser

来源:互联网 发布:2017日剧推荐知乎 编辑:程序博客网 时间:2024/06/05 05:04

上一章讲了一下如何生成一个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 {@Overrideprotected 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;@Overridepublic 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;}}