Android之XmlPullParser解析城市列表XML

效果图:



(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.youkuaiyun.com/detail/wxk105/9781674




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值