Android Pull解析XML

来源:互联网 发布:gotv源码ts 编辑:程序博客网 时间:2024/06/11 19:20

Pull解析xml文件

  • 先自己写一个xml文件,存一些天气信息

拿到xml文件

    InputStream is = getClassLoader().getResourceAsStream("weather.xml");

拿到pull解析器

    XmlPullParser xp = Xml.newPullParser();

开始解析

  • 拿到指针所在当前节点的事件类型

    int type = xp.getEventType();
  • 事件类型主要有五种

    • START_DOCUMENT:xml头的事件类型
    • END_DOCUMENT:xml尾的事件类型
    • START_TAG:开始节点的事件类型
    • END_TAG:结束节点的事件类型
    • TEXT:文本节点的事件类型
  • 如果获取到的事件类型不是END_DOCUMENT,就说明解析还没有完成,如果是,解析完成,while循环结束

    while(type != XmlPullParser.END_DOCUMENT)
  • 当我们解析到不同节点时,需要进行不同的操作,所以判断一下当前节点的name

    • 当解析到weather的开始节点时,new出list
    • 当解析到city的开始节点时,创建city对象,创建对象是为了更方便的保存即将解析到的文本
    • 当解析到name开始节点时,获取下一个节点的文本内容,temp、pm也是一样

      case XmlPullParser.START_TAG://获取当前节点的名字    if("weather".equals(xp.getName())){        citys = new ArrayList<City>();    }    else if("city".equals(xp.getName())){        city = new City();    }    else if("name".equals(xp.getName())){        //获取当前节点的下一个节点的文本        String name = xp.nextText();        city.setName(name);    }    else if("temp".equals(xp.getName())){        String temp = xp.nextText();        city.setTemp(temp);    }    else if("pm".equals(xp.getName())){        String pm = xp.nextText();        city.setPm(pm);    }    break;
  • 当解析到city的结束节点时,说明city的三个子节点已经全部解析完了,把city对象添加至list

    case XmlPullParser.END_TAG:    if("city".equals(xp.getName())){            citys.add(city);    }

    weather.xml: 放于src目录下

<?xml version="1.0" encoding="utf-8"?><weather>    <city>        <name>上海</name>        <temp>23°</temp>        <pm25>40</pm25>    </city>    <city>        <name>深圳</name>        <temp>26°</temp>        <pm25>100</pm25>    </city>    <city>        <name>北京</name>        <temp>28°</temp>        <pm25>800</pm25>    </city></weather>
public class City {    private String name;    private String temp;    private String pm25;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getTemp() {        return temp;    }    public void setTemp(String temp) {        this.temp = temp;    }    public String getPm25() {        return pm25;    }    public void setPm25(String pm25) {        this.pm25 = pm25;    }    @Override    public String toString() {        return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";    }}
public class MainActivity extends Activity {    List<City> cityList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void click(View v){        //获取天气信息xml文件        InputStream is = getClassLoader().getResourceAsStream("weather.xml");        //获取xmlpull解析器        XmlPullParser xp = Xml.newPullParser();        try {            //初始化            xp.setInput(is, "gbk");            //获取当前节点的事件类型            int type = xp.getEventType();            City city = null;            while(type != XmlPullParser.END_DOCUMENT){                switch (type) {                case XmlPullParser.START_TAG:                                    //获取当前节点的名字                    if("weather".equals(xp.getName())){                        cityList = new ArrayList<City>();                    }                    else if("city".equals(xp.getName())){                        city = new City();                    }                    else if("name".equals(xp.getName())){                                        //获取下一个节点的文本                        String name = xp.nextText();                        city.setName(name);                    }                    else if("temp".equals(xp.getName())){                        //获取下一个节点的文本,把指针移动至当前节点的结束节点                        String temp = xp.nextText();                        city.setTemp(temp);                    }                    else if("pm25".equals(xp.getName())){                        //获取下一个节点的文本                        String pm25 = xp.nextText();                        city.setPm25(pm25);                    }                    break;                case XmlPullParser.END_TAG:                    if("city".equals(xp.getName())){                        cityList.add(city);                    }                    break;                }                //把指针移动至下一个节点,并返回该节点的事件类型                type = xp.next();            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        for (City city : cityList) {            System.out.println(city.toString());        }    }}

参考:Android数据解析

原创粉丝点击