`

android 实用sax 读取xml文件内容 附源码

阅读更多
andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>李明</name>
		<age>23</age>
	</person>
	<person id="22">
		<name>李量</name>
		<age>25</age>
	</person>
</persons>


xml中的标签和内容都可以叫做节点,其中的persons  person  name age 这些都叫做元素(element).而像李明 25 这些值叫做文本节点.那么有个问题 中<persons>到<person>之间的是什么,什么都没有? 答案是他也是节点,是文本节点,你会说他里面什么都没有啊,错了,它有回车和空格.这个在sax解析xml中你debug一下就会发现.回车和空格(或者是tab)是会被读取出来的.id是属性.
2.sax
sax是采用事件驱动,就是说他不需要完全读完xml文件,他是读到一个节点就解析一个节点是否符合xml语法,如果符合就调用相对应的方法其实就是回调方法,并且没有记忆功能.下面提到的这些方法都是在ContentHander()接口中的方法.
    startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作
    startElement()   当开始解析元素的开始标签的时候,就会触发这个事件
    characters()     当读到文本元素的时候要触发这个事件.
    endElement()     当读到结束标签的时候 就会触发这个事件

    sax就是这样按照顺序来解析的.
3.sax读取xml文件举例
3-1创建一个项目 ReadXml
3-2将xml文件拷贝到根目录下.
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>李明</name>
		<age>23</age>
	</person>
	<person id="22">
		<name>李量</name>
		<age>25</age>
	</person>
</persons>

可以看出这个xml文件中有一个可以抽象出来的对象 就是person 属性有id name age
那么我们就建立一个bean
3-3:创建bean
package com.leequer.service.demo;
/**
 * <person id="23">
		<name>李明</name>
		<age>23</age>
	</person>
	<person id="22">
		<name>李量</name>
		<age>25</age>
	</person>
 * @author leequer
 * 
 * xml文件对应的bean
 */
public class Person {
	
	private Integer id;
	private String name;
	private int age;
	
	public Person ()
	{}
	public Person (String name ,int age)
	{
		this.name = name;
		this.age = 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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.id+",name  "+this.name+"  age  "+this.age+"\n";
	}
	
}


3-4:遵循mvc的架构,我们建立一个service用来读取xml
package com.leequer.service;

import java.io.InputStream;
import java.util.List;


import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.XMLReader;



import com.leequer.service.demo.Person;

public class SaxReadxml {
	public static  List<Person> readXml(InputStream inStream)throws Exception {
		SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器
		SAXParser sp = spf.newSAXParser(); // 创建sax解析器
		//XMLReader xr = sp.getXMLReader();// 创建xml解析器
		XMLContentHandler handler = new XMLContentHandler();
		sp.parse(inStream, handler);
		return handler.getPersons();
	}
}


sp.parse(inStream, handler);

这句可以看出xml文件是以流的形式传进来的,参数handler就是回调函数的实例,当sax解析器解析xml文件的时候当遇到符合xml的内容就会去handle类中调用对应的上面提到的方法.那我们建立这个XMLContentHandler 就要求这个类要实现ContentHandler()这个接口,但是这个接口中有很多需要实现的方法.sax提供了一个DefaultHandler接口 只要实现这个接口中你感兴趣的方法就可以了.

3-5:创建XMLContentHandler 并完成读取时的事件的实现 注意看注释
package com.leequer.service;

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 com.leequer.service.demo.Person;

public class XMLContentHandler extends DefaultHandler {
	private List<Person> persons;
	
	private Person person;
	private String tempString;
	private static final String NAMESTRING = "name";
	private static final String AGESTRING = "age";
	private static final String PERSONSTRING = "person";
	private static final String IDSTRING = "id";

	public List<Person> getPersons() {
		return persons;
	}
	
	/**
	 * sax 解析文件不带记忆,只读取 对xml文件中的 <person id="23"> <name>李明</name> <age>23</age>
	 * </person> <person id="22"> <name>李量</name> <age>25</age> </person> 这部分感兴趣
	 * 那么这部分包含了person这个节点元素的开始和结尾,那么就要有startElement和endElement
	 * 这两个方法;还有text的节点元素,(就是像节点之间的回车和空格还有标签中的像李明这样的文字都是文本节点 元素
	 * (text节点元素)那么要解析文本节点元素就要用到characters 这个方法来获取信息。)
	 */
/**
 * 要开始读取xml文件的时候调用的方法
 * 初始化persons
 */
	@Override
	public void startDocument() throws SAXException {
		//这里做list的初始化工作
		persons = new ArrayList<Person>();
	}

/**
 * sax 读取到文本节点的时候调用了这个方法
 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		
		if (person != null) {
			String valueString = new String(ch, start, length);
			if (NAMESTRING.equals(tempString)) {
				// 如果当前解析到的节点是name 就要将name中的文本节点元素的值得到
				person.setName(valueString);
			} else if (AGESTRING.equals(tempString)) {
				person.setAge(new Integer(valueString).intValue());
			}
		}
	}
/**
 * sax 读取到元素节点的时候用到这个方法;
 */
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// 先判断读到的元素是否是person
		if (PERSONSTRING.equals(localName)) {
			// 如果读到的是person这个元素 就要保存起来,保存在我们创建的那个person的类中 所以我们要new一个person类
			person = new Person();
			// attributes是属性。
			person.setId(new Integer(attributes.getValue(IDSTRING)));
		} 
		tempString = localName;

	}
/**
 * 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用
 * 
 * 读取完毕遇到person'的结尾 就将封装好的一个personbean保存到list中 并且清空person对象
 * 
 */
	
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		if(PERSONSTRING.equals(localName)&&person!=null)
		{
			persons.add(person);
			person = null;
		}
		tempString = null;
		
	}
	
	
	

}


3-6:写个测试类来实验 将xml文件装载入 然后读取
package com.leequer.readxml;
/**
 * 测试类
 */
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import com.leequer.service.SaxReadxml;
import com.leequer.service.demo.Person;

import android.test.AndroidTestCase;
import android.util.Log;

public class SaxReadxmlTest extends AndroidTestCase {
	private String PERSONSTRING = "ObjectPerson";
	public void testReadXml() throws Exception
	{//类装载器
		InputStream inputStream = SaxReadxmlTest.class.getClassLoader().getResourceAsStream("NewFile.xml");
		
		List <Person> personsList = SaxReadxml.readXml(inputStream);
		
		for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {
			Person person = (Person) iterator.next();
			Log.i(PERSONSTRING, person.toString());
		}
		
	}
}

完成;
activity在源码中
11
2
分享到:
评论
4 楼 me101 2013-08-10  
正在学习android开发,谢谢了。
3 楼 ljh_tnt 2012-09-18  
定!正需要这个学习下
2 楼 zqwfd 2010-09-08  
zqwfd 写道
如果我想读取name=李明的信息,应该怎么改?

自己整出来了,会了,感谢lz
1 楼 zqwfd 2010-09-08  
如果我想读取name=李明的信息,应该怎么改?

相关推荐

    android 实用sax 读取xml文件内容 附

    NULL 博文链接:https://leequer.iteye.com/blog/653148

    android 使用Sax解析XML 源码实例

    SAX 是读取和操作 XML 数据的更快速、更轻量的方 法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理...

    android使用pull 解析xml文件源码

    pull解析xml文件,和sax和dom一样 都可以脱离android单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字, 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 ...

    使用SAX读取XML文件

    NULL 博文链接:https://justsee.iteye.com/blog/923439

    Android读取XML文件(SAX)

    NULL 博文链接:https://xiva.iteye.com/blog/853098

    Java解析XML文档(二):sax读取xml文件导出excel

    NULL 博文链接:https://suky.iteye.com/blog/621169

    jsp操作xml源码,解析器为DOM和SAX

    利用JSP直接读写XML文件,分别用DOM解析器和SAX解析器加以实现,非常适合初学者入门,作为一个了解jsp与XML的台阶

    javaSAX方式解析xml文档

    java从服务器读取xml文件并以SAX方式解析附带(服务器与解析源码)

    Qt读取XML例程.zip

    Qt使用DOM和SAX两种方式操作XML文件的例程,源码来源为霍亚飞老师的《Qt Creator快速入门》(第三版)

    传智播客Android视频教程-课程源码.rar

    5&gt; XML解析(SAX/DOM/PULL),写xml文件 6&gt; SharedPreferences 第三天 1&gt; SQLite数据库添删改查操作 A.创建数据库 B.SQLiteOpenHelper自动创建数据库的原理实现 C.数据库版本变化 D.编写代码完成添删改查操作...

    jsp基于XML实现用户登录与注册的实例解析(附源码)

    1.xml的读取和存储,主要是用到dom4j技术,(网络中的文件存储路径采用classLoader) 文件的读取和存储,写了一个工厂类 public class DocumentFactory { private static Document dom=null;//需要共享一个dom,...

    dom4j-1.6.1 + w3cschool.CHM离线帮助文档

    它是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在内存的使用上。和性能上。都优于 Dom 解析。 第三方的解析: jdom 在 dom 基础上进行了封装、 dom4j 又对 jdom 进行...

    JAVA 范例大全 光盘 资源

    实例108 SAX解析XML文件 297 实例109 W3C解析XML文件 301 第13章 Java网络编程 306 实例110 获取IP地址和域名 306 实例111 获取网络资源(URL) 308 实例112 FTP文件传输模拟 311 实例113 自制浏览器 316 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse卸载 ...

    java web 视频、电子书、源码(李兴华老师出版)

    18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse...

    Java核心技术II(第8版)

    第一章 流与文件 1.1 流 1.1.1 读入和写出字节 1.1.2 完整的流家族 1.1.3 组合流过滤器 1.2 文本输入与输出 1.2.1 如何写出文本输出 1.2.2 如何读入文本输入 1.2.3 以文本格式存储对象 1.2.4 字符集 1.3 读入和写出...

    精通Qt4编程(第二版)源代码

    \8.1 读写文本文件 219 \8.2 操作二进制文件 220 \8.3 临时文件 222 \8.4 目录操作和文件管理 222 \8.4.1 目录操作 222 \8.4.2 文件管理 224 \8.5 监视文件系统变化 225 \8.6 文件引擎 226 \8.7 小结 226 \...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse卸载 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse卸载 ...

Global site tag (gtag.js) - Google Analytics