在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;
}
}
// 运行结果如下: