Xml数据原型为:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>30</age>
</person>
<person id="20">
<name>李向梅</name>
<age>25</age>
</person>
</persons>
--------------------------------------------------》
1. 编写XML解析类
package cn.android.util;
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 cn.android.domain.Person;
/**
* 继承DefaultHandler类
* 用于解析XML文档的解析类
* @author Administrator
*
* 2010-6-28 下午07:51:20
*/
public class XmlParser extends DefaultHandler{
//此处将XML里的数据封装成Person类,personList用于装解析后的数据
private List<Person> personList = new ArrayList<Person>();
//定义一个Person引用
private Person person = null;
//定义一个标记变量,标记当前的Xml文件被解析到哪个标签
private String currentTag = null;
/**
* 返回解析后的数据,是一个对象数组
* @return
*/
public List<Person> getObjectListFromXML() {
return personList;
}
/**
* 解析XML时,当开始读到一个元素标签开始时,执行下面方法
*/
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
//判断标签名是否为person,是的话创建一个Person对象,并将其id属性拿出来,赋值到person对象中
if("person".equals(localName)) {
person = new Person();
Integer id = new Integer(attributes.getValue(0));
person.setId(id);
}
//标记当前标签名
currentTag = localName;
}
/**
* 解析XML时,当开始读到一个文本元素时,执行下面方法
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//判断此文本元素是在一个 有效的标签体里面的 例:正确:<name>文本元素</name> 错误: 文本元素<name></name>
if(currentTag != null) {
//如果此文本元素为有效,则得到它的内容
String value = new String(ch, start, length);
//如果是在name标签里,则赋值给person的name属性
if("name".endsWith(currentTag)) {
person.setName(value);
}
//如果是在age标签里,则赋值给person的age属性
if("age".endsWith(currentTag)) {
person.setAge(new Short(value));
}
}
}
/**
* 解析XML时,当读到结束一个元素标签时,执行下面方法
*/
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
//将当前标签名制空
currentTag = null;
//如果当前结束的标签名是person的话,代表一个person对象已经读取完毕。将其添加到list后制空
if("person".endsWith(localName)) {
personList.add(person);
person = null;
}
}
}
---------------------------------------------------------------------------------------------------------------------》
2。测试类:
package cn.android.xml;
import java.io.InputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import android.test.AndroidTestCase;
import android.util.Log;
import cn.android.domain.Person;
import cn.android.util.XmlParser;
public class TestSAX extends AndroidTestCase {
public void testParse() throws Throwable {
try {
//得到SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
// 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性
// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
SAXParser saxParser = spf.newSAXParser(); // 创建解析器
//得到SAX解析实现类
XmlParser handler = new XmlParser();
//将xml文件以输入流的形式读入到内存中。
InputStream inStream = XmlParseActivity.class.getClassLoader().getResourceAsStream("person.xml");
//开始解析
saxParser.parse(inStream, handler);
//关闭输入留
inStream.close();
//将得到的每个对象信息写入到日志中
for(Person person : handler.getObjectListFromXML()) {
Log.i("XmlParseActivity", person.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
注:域对象Person类:
package cn.android.domain;
public class Person {
private Integer id;
private String name;
private Short age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
@Override
public String toString() {
return id + "---" + name + "---" + age;
}
}
Android--XML文件解析(SAX)
最新推荐文章于 2013-07-11 09:02:36 发布