在安卓中有很多种解析方式。按照大方向有xml解析和json解析。而,细致的分,xml和json解析各有自己的很多解析方式。今天这一篇主要介绍xml解析中的pull解析。对于xml的解析方式,我之前在javaweb一些知识中有写过dom和dom4j等等解析方式。有兴趣的读者可以去javaweb篇里面找相关的内容。
先自定义一个数据源,假设就是访问服务器返回的xml数据文件名称为weather.xml:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <weather> <city> <name>北京</name> <temp>5°</temp> <pm>80</pm> </city> <city> <name>西安</name> <temp>-5°</temp> <pm>800</pm> </city> <city> <name>南京</name> <temp>12°</temp> <pm>60</pm> </city> </weather>
针对此,建立一个javabean,以稍后保存上边的数据。每一个city就代表一个对象。这样更符合面向对象的思想
在mainactivity中代码完成解析过程:
package com.itydl.pullparser; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import com.itheima.pullparser.domain.City; import android.os.Bundle; import android.app.Activity; import android.util.Xml; import android.view.Menu; import android.view.View; //服务器向客户端传送数据。这些数据一般保存在xml文件中的。因此需要对数据进行解析、 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){ //获取到src文件夹下的资源文件ClassLoader.getResourceAsStream.返回的是InputStream类型的。 InputStream is = getClassLoader().getResourceAsStream("weather.xml"); //拿到pull解析器对象XmlPullParser是一个接口,不可以new XmlPullParser xp = Xml.newPullParser(); //初始化 try { xp.setInput(is, "utf-8");//初始化,设置文件的位置流对象(解析目标文件对象)和解析编码格式 //获取当前节点的事件类型,因为pull解析是从xml文件第一行头节点往下解析的,“指针”往下移动,标签(节点)不同,事件类型就不同。 //通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作 int type = xp.getEventType(); City city = null; while(type != XmlPullParser.END_DOCUMENT){//xp.END_DOCUMENT //根据节点的类型,要做不同的操作 switch (type) { case XmlPullParser.START_TAG: // 获取当前节点的名字 if("weather".equals(xp.getName())){ //创建city集合对象,用于存放city的javabean cityList = new ArrayList<City>(); } else if("city".equals(xp.getName())){ //创建city的javabean对象 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; case XmlPullParser.END_TAG: if("city".equals(xp.getName())){ //把city的javabean放入集合中。三个城市city,解析完一个城市就把那个城市实例放到集合里面去。 cityList.add(city); } break; } //把指针移动到下一个节点,并返回该节点的事件类型 type = xp.next(); } for (City c : cityList) { System.out.println(c.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }运行程序,解析结果如下: