android xml解析类,Android xml 解析

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();

代码实例:

代码结构:

7bd158c100f7db4584571077827719b2.png

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 getWeatherInfos(InputStream is)

throws Exception {

List 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();

} 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 infos = WeatherService

.getWeatherInfos(MainActivity.this.getClassLoader()

.getResourceAsStream("weather.xml"));

StringBuilder sb = new StringBuilder();

for (WeatherInfo info : infos) {

sb.append(info.toString());

sb.append("

");

}

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值