你的位置:首页 > 操作系统

[操作系统]Android pull解析xml文件


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

先自己写一个

<??><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;  }  }

拿到

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

拿到pull解析器

开始解析

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

int type = xp.getEventType();

* 事件类型主要有五种
* START_DOCUMENT: * END_DOCUMENT: * START_TAG:开始节点的事件类型
* END_TAG:结束节点的事件类型
* TEXT:文本节点的事件类型

如果获取到的事件类型不是END_DOCUMENT,就说明解析还没有完成,如果是,解析完成,while循环结束

while(type != * 当我们解析到不同节点时,需要进行不同的操作,所以判断一下当前节点的name
* 当解析到weather的开始节点时,new出list
* 当解析到city的开始节点时,创建city对象,创建对象是为了更方便的保存即将解析到的文本
* 当解析到name开始节点时,获取下一个节点的文本内容,temp、pm也是一样

case //获取当前节点的名字
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 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.import com.wuyudong.pullparser.domain.City;import android.os.Bundle;import android.app.Activity;import android.util.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) {    // 得到    InputStream is = getClassLoader().getResourceAsStream("weather.);    // 获取pull解析器     try {      xp.setInput(is, "utf-8");      // 获取当前节点的事件类型      int type = xp.getEventType();      City city = null;      while (type != switch (type) {        case // 获取当前节点的名字          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 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());    }  }}

运行程序结果如图: