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

Android之XmlPullParser解析城市列表XML

2017-03-14 17:11 531 查看
效果图:



(1)首先我们放一个文件名为cities.xml的XML文件到assets目录下,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<cities>
<city>
<name>北京</name>
<code>101</code>
</city>
<city>
<name>上海</name>
<code>021</code>
</city>
<city>
<name>南京</name>
<code>020</code>
</city>
<city>
<name>广州</name>
<code>050</code>
</city>
</cities>


文件目录结构:



然后创建一个javabean,其内容如下:

package com.example.xiaoke.xmldemo;

import android.os.Parcel;
import android.os.Parcelable;

/**
* Q164454216
* Created by xiaoke on 2017/3/14.
*/

public class CityBean implements Parcelable {
private String name;
private String code;

@Override
public String toString() {
return "CityBean{" +
"name='" + name + '\'' +
", code='" + code + '\'' +
'}';
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeString(this.code);
}

public CityBean() {
}

protected CityBean(Parcel in) {
this.name = in.readString();
this.code = in.readString();
}

public static final Creator<CityBean> CREATOR = new Creator<CityBean>() {
@Override
public CityBean createFromParcel(Parcel source) {
return new CityBean(source);
}

@Override
public CityBean[] newArray(int size) {
return new CityBean[size];
}
};
}
这里我实现了序列化,看个人需要。

(2)在src目录下写一个接口ICityparser,其内容如下:

/**
* Q164454216
* Created by xiaoke on 2017/3/14.
*/

public interface ICityparser {

/**
*
* 解析输入流,获取City列表
* @param is
* @return
* @throws Exception
*/
List<CityBean> parse(InputStream is) throws Exception;
}


在src目录下写一个上面接口的实现类CityparserImpl,其内容如下,代码已经详细注释:

/**
* Q164454216
* Created by xiaoke on 2017/3/14.
*/

public class CityparserImpl implements ICityparser {
@Override
public List<CityBean> parse(InputStream is) throws Exception {
List<CityBean> list=null;
CityBean city=null;
//创建XmlPullParser实例
XmlPullParser xmlPullParser= Xml.newPullParser();
//设置输入流,并指明编码方式
xmlPullParser.setInput(is,"UTF-8");
//产生第一个事件
int eventType = xmlPullParser.getEventType();
while (eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
case XmlPullParser.START_DOCUMENT:
list=new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if (xmlPullParser.getName().equals("city")){// 判断开始标签元素是否是city
city=new CityBean();
}else if (xmlPullParser.getName().equals("name")){
eventType=xmlPullParser.next();//让解析器指向name属性的值
city.setName(xmlPullParser.getText());// 得到name标签的属性值,并设置city的name
}else if (xmlPullParser.getName().equals("code")){
eventType=xmlPullParser.next();
city.setCode(xmlPullParser.getText());
}
break;
case XmlPullParser.END_TAG:
if (xmlPullParser.getName().equals("city")) { // 判断结束标签元素是否是city
list.add(city); // 将city添加到citys集合
city = null;
}
break;

}
// 进入下一个元素并触发相应事件
eventType = xmlPullParser.next();
}

return list;
}
(3)在src目录下的Activity内容如下:

public class MainActivity extends AppCompatActivity {

private  List<CityBean> list=new ArrayList<>();
private TextView tv_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_name= (TextView) findViewById(R.id.tv_name);
initData();
}

/**
* 填充数据
*/
private void initData() {
try {
//通过assertmanager的open方法获取到city.xml文件的输入流
InputStream inputStream=this.getAssets().open("cities.xml");
//初始化自定义的CityparserImpl
CityparserImpl cityparser=new CityparserImpl();
//调用CityparserImpl的parse()方法,将输入流传进去解析,返回的链表结果赋给List
list = cityparser.parse(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
String cityStr="";
for (CityBean cityBean:list){
cityStr+=cityBean.toString();
}
tv_name.setText(cityStr);
}

}


项目非常简单。

demo地址:http://download.csdn.net/detail/wxk105/9781674
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息