XML 经常使用的三种解析方式:

DOM: 所有载入到内存,生成一个树状结构,占用内存比較大。

SAJ: 採用事件驱动,速度快,效率高,不支持回退

PULL:也是採用事件驱动,语法简洁。

步骤:

1. 创建XML 解析器:XmlPullParser parser = Xml.newPullParser();

2. 配置解析器:parser.setInput(is, "utf-8");// 參数为 xml 文件输入流 和 编码方式。

3. 依据事件进行解析。

    int type = parser.getEventType();// 得到事件类型    type = parser.next();// 获取下一个事件      


事件类型:

XmlPullParser.END_DOCUMENT 文档末尾。

XmlPullParser.START_TAG 開始标签

XmlPullParser.END_TAG 结束标签

获取标签名字:parser.getName()

获取属性: String idStr = parser.getAttributeValue(0); // 參数为属性id。

获取标签内容:String temp = parser.nextText();

代码实例:

代码结构:

WeathreService.java

package com.serviatech.weather.service;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.util.Xml;import com.serviatech.weather.domain.WeatherInfo;public class WeatherService {public static List<WeatherInfo> getWeatherInfos(InputStream is)throws Exception {List<WeatherInfo> weatherInfos = null;WeatherInfo weatherInfo = null;XmlPullParser parser = Xml.newPullParser();parser.setInput(is, "utf-8");// 初始化解析器int type = parser.getEventType();// 得到事件类型while (type != XmlPullParser.END_DOCUMENT) {switch (type) {case XmlPullParser.START_TAG:if ("infos".equals(parser.getName())) {weatherInfos = new ArrayList<WeatherInfo>();} else if ("city".equals(parser.getName())) {weatherInfo = new WeatherInfo();String idStr = parser.getAttributeValue(0);weatherInfo.setId(Integer.parseInt(idStr));} else if ("temp".equals(parser.getName())) {String temp = parser.nextText();weatherInfo.setTemp(temp);} else if ("wind".equals(parser.getName())) {String wind = parser.nextText();weatherInfo.setWind(wind);} else if ("name".equals(parser.getName())) {String name = parser.nextText();weatherInfo.setName(name);}break;case XmlPullParser.END_TAG:if ("city".equals(parser.getName())) {// 一个城市已经处理完成weatherInfos.add(weatherInfo);weatherInfo = null;// 方便垃圾回收机回}break;}type = parser.next();}return weatherInfos;}}/* * 解析过程 定义了一个指针,指向开头 *  * 标签 tag,文本 *  * 文档開始 文档结束 *  * startTag endTag */


WeatherInfo.java

package com.serviatech.weather.domain;public class WeatherInfo {private int id;private String name;private String temp;private String wind;public int getId() {return id;}@Overridepublic String toString() {return "WeatherInfos [城市id=" + id + ", 名字=" + name + ", 温度=" + temp+ ", 风力=" + wind + "]";}public void setId(int id) {this.id = id;}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 getWind() {return wind;}public void setWind(String wind) {this.wind = wind;}}/* * DOM 所有载入到内存。生成一个树状结构,消耗内存比較大 *  * SAX 基于事件的方式,速度快,效率高,不能回退。 *  * PULL 基于事件解析,语法简洁 */


MainActivity.java

package com.serviatech.weather;import java.util.List;import com.serviatech.weather.domain.WeatherInfo;import com.serviatech.weather.service.WeatherService;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) findViewById(R.id.tv);try {List<WeatherInfo> infos = WeatherService.getWeatherInfos(MainActivity.this.getClassLoader().getResourceAsStream("weather.xml"));StringBuilder sb = new StringBuilder();for (WeatherInfo info : infos) {sb.append(info.toString());sb.append("\n");}tv.setText(sb.toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(this, "解析信息失败", 0).show();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}


更多相关文章

  1. Android(安卓)【插件化】"偷梁换柱"的高手-VirtualApk源码解析
  2. android post数据到服务器端工具类(包括postjson字符串、键值对)
  3. Android(安卓)传感器(Sensor)API教程 (二) 传感器事件
  4. CheckBox in ListView
  5. Android(安卓)use custom html tag in TextView
  6. 给 TextView 加上效果和事件响应
  7. android 自定义LabelView实现各类小标签,重要功能已标注
  8. Android之xml解析和json解析
  9. Android中Touch事件分发过程全解析

随机推荐

  1. Android(安卓)4.0调用http接口php网站的a
  2. android触摸屏控制
  3. Android(安卓)7.0 调用相机 FileProvider
  4. Android 内存泄漏相关
  5. Android寮€鍙戔€斺€擝roadcast Receiv
  6. Android系统定制和源码开发以及源码编译
  7. Android的进程间通信机制之Binder初探
  8. Android学习的几点建议(转)
  9. Android开发平台振动器系统详解
  10. android 调用Camera,获取预览帧中的图像