zoukankan      html  css  js  c++  java
  • Android pull解析xml文件

    本文介绍android中使用pull来解析xml文件

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

    <?xml version="1.0" encoding="UTF-8"?>
    <weather>
        <city>
            <name>广州</name>
            <temp>35</temp>
            <pm>23</pm>
        </city>
            <city>
            <name>上海</name>
            <temp>30</temp>
            <pm>26</pm>
        </city>
            <city>
            <name>北京</name>
            <temp>29</temp>
            <pm>55</pm>
        </city>
    </weather>

    在定义一个City类

    package com.wuyudong.pullparser.domain;
    
    public class City {
        private String name;
        private String tmp;
        private String pm;
        
        @Override
        public String toString() {
            return "City [name=" + name + ", tmp=" + tmp + ", pm=" + pm + "]";
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getTmp() {
            return tmp;
        }
        public void setTmp(String tmp) {
            this.tmp = tmp;
        }
        public String getPm() {
            return pm;
        }
        public void setPm(String pm) {
            this.pm = pm;
        }
        
    }

    拿到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);
    }

    完整代码如下:

    package com.wuyudong.pullparser;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    import com.wuyudong.pullparser.domain.City;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Xml;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        List<City> citys;
    
        @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");
    
            // 获取pull解析器
            XmlPullParser xp = Xml.newPullParser();
            try {
                xp.setInput(is, "utf-8");
                // 获取当前节点的事件类型
                int type = xp.getEventType();
                City city = null;
                while (type != XmlPullParser.END_DOCUMENT) {
                    switch (type) {
                    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.setTmp(temp);
                        } else if ("pm".equals(xp.getName())) {
                            String pm = xp.nextText();
                            city.setPm(pm);
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("city".equals(xp.getName())) {
                            citys.add(city);
                        }
                        break;
    
                    default:
                        break;
                    }
                    // 把指针移动到下一个节点,并且返回该节点的事件类型
                    type = xp.next();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            for (City city : citys) {
                System.out.println(city.toString());
            }
    
        }
    
    }

    运行程序结果如图:

  • 相关阅读:
    gitlab: git clone/pull / push: The project you were looking for could not be found
    转载: MySQL启动出错InnoDB: Check that you do not already have another mysqld process解决方法
    root用户删除文件,提示:Operation not permitted
    使用dockerfile打包新镜像
    kubernets创建Deployment
    代理全家福
    Spring事务传播详解
    [FFmpeg]Centos7 yum安装
    [Redis]存放字典
    [Docker]开放2375端口
  • 原文地址:https://www.cnblogs.com/wuyudong/p/5560338.html
Copyright © 2011-2022 走看看