在Android平台上可以使用SAX、 DOM和Android附带的pull解析器解析XML文件。android系统推荐使用pull解析,pull解析是轻量级解析,在android的内核中已经嵌入了pull,所以不需导入第三方jar包。以下讲解的是使用pull解析器来解析XML文件的实例。
1,下面是本例子要解析的XML文件city.xml(把此文件拷贝到src目录下):
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8" standalong="yes"?> <weather> <city> <name>北京</name> <temp>6*</temp> <pm2.5>300</pm2.5> </city> <city> <name>上海</name> <temp>15*</temp> <pm2.5>30</pm2.5> </city> <city> <name>深圳</name> <temp>16*</temp> <pm2.5>30</pm2.5> </city> </weather></span>
2,创建解析后数据要封装到的javabean对象:
<span style="font-size:18px;">package com.example.pull.domain; 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 type) { this.temp = temp; } public String getPm25() { return pm25; } public void setPm25(String pm25) { this.pm25 = pm25; } public City() { super(); } public City(String name,String temp,String pm25) { super(); this.name = name; this.temp = temp; this.pm25 = pm25; } @Override public String toString() { return "City [name=" + name + ",temp=" + temp + ",pm25=" + pm25 + "]"; } }</span>
3,使用pull解析器解析city.xml对象:
<span style="font-size:18px;">public class MainActivity extends Activity { private List<City> cityList; private City city; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); } // 解析xml文件 public void doClick(View v) { // 1,通过类加载器来拿到资源文件 InputStream is = getClassLoader().getResourceAsStream("city.xml"); // 2,拿到解析器对象 XmlPullParser parser = Xml.newPullParser(); try { // 3,初始化解析器对象 parser.setInput(is,"utf-8"); // 4,开始解析 // 获取当前节点的事件类型(相当于指针) int type = parser.getEventType(); while (type != XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_TAG: if ("weather".equals(parser.getName())) { // 解析到开始节点(weather)时,初始化集合对象 cityList = new ArrayList<City>(); } else if ("city".equals(parser.getName())) { // 解析到"city"节点时,初始化city对象 city = new City(); } // 解析"city"中的"name" else if ("name".equals(parser.getName())) { // 获取当前节点的下一个节点的文本 String name = parser.nextText(); city.setName(name); } // 解析"city"中的"temp" else if ("temp".equals(parser.getName())) { // 获取当前节点的下一个节点的文本 String temp = parser.nextText(); city.setTemp(temp); } // 解析"city"中的"pm25" else if ("pm25".equals(parser.getName())) { // 获取当前节点的下一个节点的文本 String pm25 = parser.nextText(); city.setPm25(pm25); } break; case XmlPullParser.END_TAG: // 如果结束节点为“city”,把此city对象存入到集合中 if ("city".equals(parser.getName())) { cityList.add(city); } break; } // 当前节点解析后,指针下移,解析下一个节点 type = parser.next(); } // 打印输出解析的文件 for (City city : cityList) { System.out.println(city.toString()); } } catch (Exception e) { e.printStackTrace(); } } }</span>