Android--XML文件解析(SAX)



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;
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值