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

代码实例:

代码结构:

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 解析,布布扣,bubuko.com

时间: 2024-12-10 10:11:16

Android xml 解析的相关文章

Android Xml解析之DOM详细攻略

参考地址:http://wenku.baidu.com/view/aca83d12cc7931b765ce15d1.html 由于dom方式是保存于内存中,比较耗内存,不过对于一些数据量比较小但又比较常用的隐秘信息,可以用此方法 People类是自己写的一个类,主要保存各个字符串数据. 1.为了具有扩展性 自己编了一个xml文件: <?xml version="1.0" encoding="utf-8"?> <peoples> <peo

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

前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml android XMl 解析神奇xstream 三: 把复杂对象转换成 xml android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象 android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的

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

前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml android XMl 解析神奇xstream 三: 把复杂对象转换成 xml 1.文件准备 把一个预先写好的xml文件放在android项目目录的 asset 文件夹. 文件内容为: <blog> <age>30</age> <

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

前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml 1.JavaBeen package com.android10; public class Person { String pName ; String pAge ; public String getpName() { return pName; } pub

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

前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 package com.android10; public class Product { private String name ; private String age ; public String getName() { return name; } public void setName(Strin

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

前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml android XMl 解析神奇xstream 三: 把复杂对象转换成 xml android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象 1.建立JavaBeen package com.android10; public class

android XML解析器全解案例

1.使用pull解析 1 package com.example.myxml; 2 3 import java.io.InputStream; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import org.xmlpull.v1.XmlPullParser; 8 import org.xmlpull.v1.XmlPullParserFactory; 9 10 import android.util.Log; 11 imp

android xml解析

android xml 解析 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式. SAX特点: 解析方式是一种基于事件驱动的,消耗的内存少 Pull特点: 解析方式是一种基于事件驱动的,消耗的内存少,在android系统内部的xml解析都是用这种方式 Dom特点: dom是把全部文件读入到内存中,这种方式很消耗内存,对于内存资源本来就很少的android手机,这种 方式不太建议使用. 个人建议:  SAX和pull都比较适合mo

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

[Android] Android XML解析学习——方式比较 (ZT) 分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/details/5981913) 一.基础知识 经过这段时间的学习,我们已经了解了Android平台上用于解析XML的三种方式:SAX.DOM和Pull.并且在学习的过程中也介绍了这三种方式各自的特点及适合的使用场合,简单的来说,DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合