Android中解析XML(SAX方式)Demo

10 篇文章 0 订阅

在Android开发中需要解析XML,那么如何解析XML文件呢?

Android参考API中提供了多种方式解析XML,其中之一就是SAX方式。


下面是本人写的一个小Demo.


工程目录如下图所示


需要解析的XML文件如下:


// textxml.xml

<?xml version="1.0" encoding="UTF-8"?>

<users>
    
    <user id="01">
        <username>Lucas Cheng</username>
        <password>1234</password>
    </user>
    
    <user id="02">
        <username>David John</username>
        <password>6789</password>
    </user>
    
</users>

// 定义User类

package xxx.xxx.xxx;

public class User {

	private String id;
	private String name;
	private String pwd;

	public String getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public String getPwd() {
		return pwd;
	}

	public void setId(String id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	/** 打印出User信息 */
	@Override
	public String toString() {
		return "ID: \t" + getId() + "\nName : \t" + getName() + "\nPwd :\t"
				+ getPwd() + "\n";
	}

}

// 定义自己的解析XML工具类,继承自DefaultHandler

package xxx.xxx.xxx;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class MyHandler extends DefaultHandler {

	private final String TAG = "MyHander";

	// 定义XML的标签及标签属性名称
	public final String ELE_ROOT = "users";

	public final String ELE_USER = "user";
	public final String ATTR_USER_ID = "id";

	public final String ELE_NAME = "username";
	public final String ELE_PWD = "password";

	// 定义临时变量
	private User user = null;
	private StringBuilder text = new StringBuilder();

	// 定义变量保存解析结果
	public List<User> userList = null;

	// 重写父类的以下方法定义自己的解析方式

	@Override
	public void startDocument() throws SAXException {
		Log.d(TAG, "Start document...");
		super.startDocument();
	}

	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
		Log.d(TAG, "End document...");
	}

	/** 开始解析一个标签时触发 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if (localName.equalsIgnoreCase(ELE_ROOT)) {// 根元素
			// 初始化返回User列表
			if (null == userList) {
				userList = new ArrayList<User>();
			} else {
				userList.clear();
			}
		} else if (localName.equalsIgnoreCase(ELE_USER)) {
			// new一个User对象,并赋给Id值
			user = new User();
			user.setId(attributes.getValue(ATTR_USER_ID));
		} else if (localName.equalsIgnoreCase(ELE_NAME)) {
			// 等待该标签结束时设置内容给user
		} else if (localName.equalsIgnoreCase(ELE_PWD)) {
			// 等待该标签结束时设置内容给user
		} else {
			// Nothing to do ...
		}
	}

	/** 解析标签中内容 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// 将标签中内容保存到临时字符串中

		text.setLength(0);
		text.append(String.valueOf(ch, start, length));
	}

	/** 结束解析一个标签时触发 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if (localName.equalsIgnoreCase(ELE_ROOT)) {// 根元素
			// nothing ...
		} else if (localName.equalsIgnoreCase(ELE_USER)) {
			userList.add(user);// user加入列表
		} else if (localName.equalsIgnoreCase(ELE_NAME)) {
			user.setName(text.toString());// 给user设置name
		} else if (localName.equalsIgnoreCase(ELE_PWD)) {
			user.setPwd(text.toString());// 给user设置pwd
		} else {
			// Nothing to do ...
		}
	}

}

// 主程序如下:Main.java

package xxx.xxx.xxx;

import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import xxx.xxx.xxx.R;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.TextView;

public class Main extends Activity {

	private TextView textResult = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		textResult = (TextView) findViewById(R.id.txt_result);
		textResult.setMovementMethod(ScrollingMovementMethod.getInstance());

		findViewById(R.id.btn_parse).setOnClickListener(
				new View.OnClickListener() {
					public void onClick(View v) {
						if (null != textResult)
							textResult.setText(parseXML());
					}
				});

		findViewById(R.id.btn_clear).setOnClickListener(
				new View.OnClickListener() {
					public void onClick(View v) {
						if (null != textResult)
							textResult.setText("");
					}
				});
	}

	protected CharSequence parseXML() {
		MyHandler handler = new MyHandler();
		try {
			// 取得XMLReader实例
			XMLReader xr = SAXParserFactory.newInstance().newSAXParser()
					.getXMLReader();
			// 为XMLReader设置处理器
			xr.setContentHandler(handler);
			// 构建XML输入流
			InputSource input = null;
			InputStream stream = getApplication().getAssets().open(
					"testxml.xml");
			input = new InputSource(stream);
			// 解析XML
			xr.parse(input);
		} catch (Exception e) {
			e.printStackTrace();
		}

		List<User> users = handler.userList;
		StringBuilder sb = new StringBuilder();
		if (null != users) {
			for (User u : users) {
				sb.append(u.toString()).append("\n");
			}
		}
		return sb;
	}
}


// 运行结果如下:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值