- 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)
最新推荐文章于 2025-08-22 11:30:46 发布