您的位置:首页 > 移动开发 > Android开发

Android中解析XML(SAX方式)Demo

2012-03-29 02:27 453 查看
在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;
}
}


// 运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: