`

android解析XML文件的三方法之SAX

 
阅读更多

    采用DOM方法读取XML文档,由于使用DOM方法需要将整个XML文档加载内存中,对系统资源占用比较多,这对内存比较紧张的Android系统来说,使用 DOM方法读取XML文档会有很大的限制。 使用SAX方法读取XML,对内存资源的占用的比较少,因此在嵌入式设备中极力推荐使用,Android也不例外,本篇幅详细说明Android中如何使用SAX读取XML文档。

    基于事件的处理模式主要围绕着事件源 以及事件处理器 来工作的。一个可以产生事件的对象被称为事件源 ,而可以对事件产生响应的对象就被叫做事件处理器 。事件源与事件处理对象是通过在事件源中的事件注册方法连接的。当事件源产生时间后,调用事件处理器相应的方法,一个事件获得处理。当在事件源调用事件处理器中特定方法的时候,会传递个事件标志以及其响应事件的状态信息,这样事件处理器才能够根据事件信息来决定自己的行为。

    在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来开始解析XML文档,并根据文档的内容产生事件。而事件处理器则是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及 EntityResolver这4个接口,它们分别处理事件源在解析XML文档过程中产生的不同种类的事件。而事件源XMLReader与这4个事件处理器的连接是通过在XMLReader中的相应事件处理器注册方法setXXXX()来完成的,详细介绍请见下表:

    以上的4个事件源处理器接口,在开发中没有必要直接从这4个接口直接继承,因为org.xml.sax.helper包为我们提供了类 DefaultHandler,其继承了这4个个接口,在实际开发中直接从DefaultHandler继承并实现相关函数就可以了。在这4个接口中,最重要的是ContentHanlder接口,下面就其中的方法加以说明,如下:

    以上就是解析一个XML文档,事件处理的过程。这里我们对org.xml.sax.XMLReader中的方法做下补充说明:除了前面介绍的一系列事件处理器注册方法set/getXXXX()外,还有个重要的函数:parse(InputSource input)–Parse an XML document,开始解析一个XML文档。
    按照应用程序开发的流程,简要介绍下SAX的使用方法
    首先,编写了解XML文档的结构,按照XML文档的结构,编写具体的数据结构,类似于:XXXXList,XXXXItem,最好与XML的文档保持一致。
    其次,开始实现事件处理对象,Android SDK为我们提供了DefaultHandler,其继承了ContentHandler 、DTDHandler、 EntityResolver、 ErrorHandler的所有接口。我们在DefaultHandler的基础上,按照需求实现ContentHanlder的所有接口,这里需要注意 2个方面的问题: 
   事件处理的顺序,处理时间的位置:一般在startDocument()初始化工作,在endDocument()中收尾的处理工作;startElement()—characters()—endDocument()是一个XML节点读取的过程,startElement()用来初始判断,characters()获取节点的字符数据,endDocument()将数据写入数据结构。
   异常SAXException的处理; 
然后,XML实体解析,过程如下:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
URL rrl = new URL(urlstring);
InputSource is = new InputSource(url.openStream());
Xmlreader.setContentHanlder(XXXX);
Xmlreader.parse(is);
     最后,在Activity中显示数据,一般先将XML中读取的数据,选择合适的Adaper对数据进行封装,然后使用ListView控件来显示数据。
    以上就是SAX读取XML的过程,并显示出最终的数据。以上需要注意的是SAXParserFactory ,SAXParser类来自 javax.xml.parsers包中。
    总结说明
    SAX读取XML文档的方法,占用内存比较少,但是开发流程相比DOM就复杂多了,具体采用哪种方法比较合适,大家可以在开发的过程中来深刻体会之间的差别。

下面以一个例子给予讲解:
1:person.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> 

  
 2:person类
package cn.itcast.domain;

public class Person {
	private Integer id;
	private String name;
	private Short age;
	
	public Person(){}
	
	public Person(Integer id, String name, Short age) {
		this.id = id;
		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 Short getAge() {
		return age;
	}
	public void setAge(Short age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
	}
	
}
 

3:SAXPersonService

package cn.itcast.service;

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

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

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import cn.itcast.domain.Person;
/**
 * 采用SAX解析XML内容
 */
public class SAXPersonService {
	
	public List<Person> getPersons(InputStream inStream) throws Throwable{
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		PersonParser personParser = new PersonParser();
		parser.parse(inStream, personParser);
		inStream.close();
		return personParser.getPersons();
	}

	private final class PersonParser extends DefaultHandler{
		private List<Person> persons = null;
		private String tag = null;
		private Person person = null;

		public List<Person> getPersons() {
			return persons;
		}

		@Override
		public void startDocument() throws SAXException {
			persons = new ArrayList<Person>();
		}
		
		@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
			if("person".equals(localName)){
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			tag = localName;
		}
		
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			if(tag!=null){
				String data = new String(ch, start, length);//获取文本节点的数据
				if("name".equals(tag)){
					person.setName(data);
				}else if("age".equals(tag)){
					person.setAge(new Short(data));
				}
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if("person".equals(localName)){
				persons.add(person);
				person = null;
			}
			tag = null;
		}
	}
}

 4:测试类PersonTest

public class PersonTest extends AndroidTestCase {
private static final String TAG="PersonTest";
public void testSAXService()throws Throwable{
       SAXService saxservice=new SAXService();
       InputStream inStream=this.getClass().getClassLoader().getResourceAsStream("person.xml");
       List <Person> persons=saxservice.personService(inStream);
       for(Person p:persons){
             Log.i(TAG,p.toString());
       }
}

}

 

 可参考:http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016595.html

分享到:
评论

相关推荐

    android下解析xml文件的demo

    本教程将详细介绍如何在Android环境下解析XML文件,以"ReadXMLDemo"为例,展示具体步骤和关键知识点。 首先,XML(eXtensible Markup Language)是一种自定义标记语言,它的结构清晰,易于读写,适合于数据交换和...

    android 解析XML文件 生成XML文件

    三、Pull解析器解析XML文件 Android提供了XMLPullParser,这是一种基于事件的轻量级解析器,适合移动设备资源有限的环境。使用Pull解析器的主要步骤: 1. 创建XMLPullParser实例,通常使用XMLPullParserFactory和...

    android解析XML文件样例SAX方法

    本篇文章将详细介绍如何在Android平台上使用SAX方法解析XML文件。 首先,我们需要在Android项目中引入SAX解析器。Android SDK自带了SAX解析器,因此无需额外添加依赖库。接下来,我们将按照以下步骤来解析XML文件:...

    android 三种方式解析XML(DOM,Pull,Sax) 带文件编码识别

    本篇文章将深入探讨三种在Android中解析XML的方法:DOM(文档对象模型)、Pull(拉取解析器)和SAX(简单API for XML),并且会特别强调如何识别文件编码。 首先,DOM解析是将整个XML文件加载到内存中形成一个树形...

    Android 解析xml文件

    本篇将深入探讨Android中解析XML文件的方法,以及如何通过示例代码`ReadXmlConfigFile`来实现这一过程。 ### XML解析器类型 Android提供了多种解析XML的方式,主要包括以下几种: 1. **DOM解析器**:Document ...

    Android 解析 XML 三种方法

    总结,Android解析XML的三种方法——SAX、DOM和PULL,各有适用场景。理解它们的工作原理和优缺点,可以帮助我们更好地选择和运用XML解析技术,提高应用的效率和用户体验。在实践中不断学习和探索,才能真正掌握这些...

    xml.rar_android_android sax_android sax xml_java xml_sax

    - 示例代码:创建一个SAX解析器实例,设置处理器,然后调用`parse()`方法解析XML文件。 4. DOM解析: - DOM解析将整个XML文档加载到内存中形成一棵树形结构,可以方便地通过节点遍历和操作。适合小规模、频繁读写...

    Sax解析xml文件

    SAX解析器的工作原理是基于事件驱动的,它在解析XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者通过实现SAX解析器的回调接口(如ContentHandler),在这些事件发生时执行相应的...

    Android XML解析(DOM、PULL、SAX三种方式)

    例如,你可以使用`DocumentBuilderFactory`来创建`DocumentBuilder`,然后用`parse()`方法解析XML文件。在提供的`DomXmlOperate`示例中,可能包含了如何使用DOM解析XML并绑定到View(如使用ButterKnife库)的代码。 ...

    Android解析XML文件的三方法

    本文将详细介绍Android中三种解析XML文件的方法:SAX解析、DOM解析以及Android内置的Pull解析。 1. **SAX解析(Simple API for XML)**: - SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到...

    Android 创建与解析XML Sax方式

    Android中解析XML文件SAX方式 SAX解析器会触发一系列的事件,如开始文档、开始元素、结束元素等,开发者需要通过实现`DefaultHandler`或自定义的`ContentHandler`来处理这些事件。以下是一个基本的SAX解析器使用...

    [Android]使用SAX解析XML文件

    总结,SAX解析XML在Android开发中是一个实用且高效的解决方案,尤其适用于处理大型XML文件。通过创建自定义的事件处理器,可以灵活地解析和处理XML数据,满足各种业务需求。不过,需要注意的是,由于SAX是基于事件的...

    android xml文件解析 SAX

    解析XML文件是Android开发者必须掌握的一项技能。本篇将详细介绍Android中的SAX(Simple API for XML)解析方式。 SAX是一种事件驱动的XML解析器,它不会像DOM解析器那样将整个XML文档加载到内存中,而是逐行读取,...

    android使用SAX解析xml

    - `xmlSAXPaserDemo`可能是一个包含示例代码的Android项目,用于演示如何实际使用SAX解析XML文件。 - 项目中可能包括网络请求模块、SAX解析器处理类以及展示解析结果的UI部分。 通过以上步骤,开发者可以在...

    Android之SAX解析XML

    本文将深入探讨如何在Android环境中使用SAX(Simple API for XML)解析XML文件。SAX是一种事件驱动的解析器,它在读取XML文档时触发一系列事件,开发者可以注册事件处理器来处理这些事件,从而实现对XML数据的高效、...

    Android中,使用SAX和PULL解析天气预报XML

    该文章详细介绍了在Android环境下如何使用SAX和PULL解析XML,包括代码示例和步骤说明,对于初学者来说非常有帮助。 最后,压缩包中的"Weather"文件很可能是示例的天气预报XML数据。通过实际解析这个文件,你可以更...

    Android SAX、DOM、Pull解析xml文件案例讲解

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在移动应用开发,如Android中,解析XML文件是常见的任务。本篇将详细讲解Android中三种主要的XML解析方式:SAX(Simple API for XML)...

    老罗Android视频开发教程 android解析xml文件代码

    老罗的Android视频教程深入浅出地讲解了如何在Android平台上解析XML文件,这对于开发者来说是非常重要的技能。以下是对这个主题的详细解释。 1. **XML基本概念** XML是一种自描述的语言,其结构清晰,易于机器和...

    Android XML解析之SAX解析

    在Android中,有多种解析XML的方法,如DOM、SAX和Pull解析器。本篇主要讨论的是SAX解析,这是一种基于事件驱动的、高效的解析方式,适合处理大体积的XML文件。 SAX解析器逐行读取XML文档,当遇到开始标签、结束标签...

    android解析xml的4种方法

    本文将深入探讨在Android环境中解析XML的四种主要方法:DOM、SAX、Pull Parser以及XMLPullParser。 1. DOM解析器: DOM(Document Object Model)是一种将XML文档加载到内存中形成一棵树形结构的方法。它一次性读取...

Global site tag (gtag.js) - Google Analytics