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;
} @Override
public 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; @Override
protected 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 block
e.printStackTrace();
Toast.makeText(this, "解析信息失败", 0).show();
} } @Override
public 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;
} }

Android xml 解析的更多相关文章

  1. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  2. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  3. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  4. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  5. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  6. Android] Android XML解析学习——方式比较

     [Android] Android XML解析学习——方式比较 (ZT)  分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...

  7. Android XML解析器的问题

    最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串 ...

  8. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

    简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...

  9. android XML解析器全解案例

    1.使用pull解析 package com.example.myxml; import java.io.InputStream; import java.util.ArrayList; import ...

随机推荐

  1. phpcms 如何获取文章

    请求地址http://127.0.0.1/phpcms/index.php?m=content&c=index&a=show&catid=6&id=8 先来判断地址对应 ...

  2. ajax xmlhttprequest status

    status 0**:未被始化 status 1**:请求收到,继续处理 status 2**:操作成功收到,分析.接受 status 3**:完成此请求必须进一步处理 status 4**:请求包含 ...

  3. Linux删除用户

    删除用户 # userdel abc 该删除操作将用户删除但保留用户的home文件夹和邮件文件夹.并且当用户abc正在登录的时候,删除操作将失败,如下: # userdel abc userdel: ...

  4. openshif ssh proxy

    最近google又被墙了.没办法 1:注册一个openshift账号.申请注册一个app,获取一个免费主机.   https://www.openshift.com/ 2:去PuTTY官方网站下载pL ...

  5. ural1057Amount of Degrees

    Description Create a code to determine the amount of integers, lying in the set [ X; Y] and being a ...

  6. codevs 1078 最小生成树

    题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这 ...

  7. BZOJ 3744 Gty的妹子序列

    Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...

  8. BZOJ 1087 互不侵犯

    Description 在\(N \times N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8 ...

  9. 【Web Service】WSDL文档

    WSDL文档仅仅是一个简单的XML文档. 它包含一系列描述某个web service的定义. WSDL WSDL 是基于 XML 的语言,用于描述 Web services 以及如何访问它们. WSD ...

  10. JPA学习笔记

    一.JPA基础1.1 JPA基础JPA: java persistence api 支持XML.JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 ...