`

android xml解析 - sax

阅读更多
android 2.3 sdk提供的与sax解析相关的类和接口
它们主要存在与以下的这些包中:
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers
javax.xml.parsers
android.sax

sax相关介绍
sax存在两个版本1和2,1已经过时了,所以与其相关的api基本也可以忽略(除非是处理遗留代码),现在的话主要使用2.0的sax。

sax是一种推式解析器,所有的事件都是解析器主动发给我们的。它会根据事件的类型,去调用规定好的事件方法。

sax通过以下的接口来规定了一系列的事件方法:
org.xml.sax包中:
ContentHandler,主要包含了在遇到起始标签,结束标签,内容等事件时会调用的方法
ErrorHandler,主要包含了在解析xml时,出现错误时会调用的方法
DTDHandler,主要包含了解析dtd文档时,遇到notation、未解析的entity resolver等事件时,会调用的方法

org.xml.sax.ext包中:
LexicalHandler,主要包含了在遇到comment(注释),dtd declaration(dtd声明),CDATA等事件时会调用的方法
DeclHandler,用在dtd文件中,主要包含了在遇到dtd文档中的相应事件时调用的方法
以下三个很少会用到,这里不做介绍。
Attributes2
EntityResolver2
Locator2

还需要知道的一个类org.xml.sax.helpers.DefaultHandler:
该类可以看作是一个适配器类,就是它实现了ContentHandler, DTDHandler, EntityResover, ErrorHandler,但是在其内部什么也没做,仅仅是为了方便我们使用。
一般的话我们会继承这个类来写事件处理代码,而不是去实现接口。

sax解析一般数据
解析的数据和前一篇中提到的一样:
<root><data><create>8</create><fans>4</fans><home>9</home><mentions>0</mentions><private>0</private></data><errcode>0</errcode><msg>ok</msg><ret>0</ret></root>
<!-- 便于阅读的格式 -->  
<root>  
    <data>  
        <create>8</create>  
        <fans>4</fans>  
        <home>9</home>  
        <mentions>0</mentions>  
        <private>0</private>  
    </data>  
    <errcode>0</errcode>  
    <msg>ok</msg>  
    <ret>0</ret>  
</root>  

// 解析器创建
SAXParserFactory factory = SAXParserFactory.newInstance();
// 配置要创建的parser的特性,配置特性的方法在android api中是无法调用的(主要是考虑到它是移动设备,某些特性太耗性能了)
// 像腾迅微博返回的xml数据可以交换关闭dtd验证(提升3倍的速度)和命名空间
// factory.setValidating(false); // 在android上默认为false
// factory.setNamespaceAware(false); // 在android上默认为false
// 创建解析器
SAXParser parser = factory.newSAXParser();
InputSource source = new InputSource("d:/test.xml");
MyDefaultHandler handler = new MyDefaultHandler();
parser.parse(source, handler);


// 事件处理类
public class MyDefaultHandler extends DefaultHandler {
	@Override
	public void startDocument() throws SAXException {
		// 文档开始
	}
	
	@Override
	public void endDocument() throws SAXException {
		// 文档结束
	}

	private static final int root = 0;
	private static final int data = 1;
	private static final int create = 2;
	private static final int fans = 3;
	private static final int home = 4;
	private static final int mentions = 5;
	private static final int privates = 6;

	int currentTag = -1;
	StringBuilder text = null;
	
	// lName(local name)只有在开启命名空间(setNamespaceAware时才有值),而qName是一直有值的
	// 注意在android上,默认命名空间为false,但它的lName总是有值,qName总是没值(如:yd:phone,lName会返回phone)
	@Override
	public void startElement(String uri, String lName, String qName, Attributes attrs)
			throws SAXException {
		if ("root".equals(qName)) {
			currentTag = root;
		} else if ("data".equals(qName)) {
			currentTag = data;
		} else if ("create".equals(qName)) {
			currentTag = create;
			text = new StringBuilder();
		} else if ("fans".equals(qName)) {
			currentTag = fans;
			text = new StringBuilder();
		} else if ("home".equals(qName)) {
			currentTag = home;
			text = new StringBuilder();
		} else if ("mentions".equals(qName)) {
			currentTag = mentions;
			text = new StringBuilder();
		} else if ("private".equals(qName)) {
			currentTag = privates;
			text = new StringBuilder();
		} else {
			// unknow element, just pass
		}
	}

	// lName(local name 没有前缀的名称)只有在开启命名空间(setNamespaceAware时才有值),而qName是一直有值的
	// 注意在android上,默认命名空间为false,但它的lName总是有值,qName总是没值(如:yd:phone,lName会返回phone)
	@Override
	public void endElement(String uri, String lName, String qName)
			throws SAXException {
		switch (currentTag) {
		case root:
			// 该元素结束后,马上就是endDocument了。
			break;

		case data:
			currentTag = root;
			break;

		case create:
			// setCreate(text.toString());
			currentTag = data;
			break;

		case fans:
			// setFans(text.toString());
			currentTag = data;
			break;

		case home:
			// setHome(text.toString());
			currentTag = data;
			break;

		case mentions:
			// setMentions(text.toString());
			currentTag = data;
			break;

		case privates:
			// setPrivates(text.toString());
			currentTag = data;
			break;

		default:
			// unknow element, just pass
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		switch (currentTag) {
		case create:
		case fans:
		case home:
		case mentions:
		case privates:
			// get the text
			text.append(new String(ch, start, length));
			break;

		case root:
		case data:
		default:
			// have no interesting text to get
		}
	}
}
分享到:
评论
1 楼 lsz10122 2011-12-30  
                         

相关推荐

    Android网络之数据解析----SAX方式解析XML数据

    1. 创建XML解析器:首先,我们需要创建一个XMLReader对象,它是SAX解析器的接口,可以通过XMLReaderFactory类来实例化。 2. 设置事件处理器:然后,我们为XMLReader对象设置一个ContentHandler,这是一个接口,包含...

    Android XML解析之SAX解析

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

    Android XML解析——Sax解析XML

    XML解析是将XML文档转换为应用程序可以处理的数据的过程。本篇文章将重点讨论Android中的SAX(Simple API for XML)解析器,这是一种事件驱动的解析方法,适合处理大文件或内存有限的设备。 ### SAX解析原理 SAX...

    android xml文件解析 SAX

    SAX是一种事件驱动的XML解析器,它不会像DOM解析器那样将整个XML文档加载到内存中,而是逐行读取,遇到每个元素或属性时触发相应的事件回调。这种方式节省了内存,特别适合处理大型XML文件。 1. **SAX解析的基本...

    android----xml Sax解析示例

    总之,Android平台上的XML解析,特别是SAX解析,是一个重要的技能,可以帮助开发者高效地处理XML数据,节约宝贵的系统资源。通过理解和实践SAX解析,开发者能够更好地处理XML文档,为应用提供更加流畅的性能体验。

    xml.rar_android_android sax_android sax xml_java xml_sax

    本资料包“xml.rar”主要关注Android环境下的XML解析,特别是SAX解析器,同时也涵盖了DOM和Pull解析方式。 1. XML基本概念: XML是一种自描述性的标记语言,它通过标签来定义数据结构。每个XML文档都包含元素、...

    Android XML解析之SAX方式

    在Android开发中,处理XML数据有多种方式,包括SAX(Simple API for XML)、DOM(Document Object Model)和PULL解析器。本篇文章将重点讨论SAX解析器,一种事件驱动的解析模型,它以流式处理XML文档,具有内存占用...

    android学习笔记1--SAX解析XML

    而为了处理这些XML文件,开发者需要了解不同的XML解析技术,其中SAX(Simple API for XML)是一种常见的流式解析方式。 #### SAX解析XML的基本原理 SAX是一种基于事件驱动的解析方式,它通过一系列事件来通知应用...

    android xml 的解析 sax dom pull 解析

    在Android开发中,有三种主要的XML解析技术:SAX(Simple API for XML)、DOM(Document Object Model)和PULL(Pull Parser)。下面将详细介绍这三种解析方式及其在Android中的应用。 1. SAX解析: SAX(Simple ...

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

    Android系统提供了三种主要的XML解析方式:DOM(Document Object Model)、PULL(Pull Parser)和SAX(Simple API for XML)。每种方法都有其独特的特性和应用场景,下面将详细介绍这三种XML解析方式。 1. DOM解析...

    android使用SAX解析xml

    - Android提供了两种主要的XML解析方式:DOM(文档对象模型)和SAX。DOM解析器将整个XML文档加载到内存中形成一棵树,适合小规模数据;SAX则更适用于大文件,因为它按需解析。 3. **SAX解析流程** - 创建`...

    android下解析xml文件的demo

    在Android应用中,我们通常使用两种方式来解析XML:DOM(Document Object Model)解析器和SAX(Simple API for XML)解析器。 1. DOM解析: DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历...

    XML解析之SAX解析DEMO

    本文将深入探讨XML解析中的SAX(Simple API for XML)解析方法,并结合一个具体的Android 4.0网络编程示例进行详细讲解。 SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到内存,而是逐行读取...

    Android 创建与解析XML Sax方式

    总结,Android中的XML解析主要有DOM、SAX和XMLPullParser三种方式,每种都有其适用场景。SAX适用于处理大文件和节省内存,而DOM适用于需要频繁查询和修改的场景,XMLPullParser则提供了一种介于两者之间的灵活性。...

    Android XML解析 SAX DOM Pull

    在Android中,有三种主要的XML解析方式:SAX(Simple API for XML)、DOM(Document Object Model)和Pull Parser。下面将详细介绍这三种解析方式,并结合person类的实例进行讲解。 1. SAX解析: SAX是一种事件驱动...

    六,Android Xml解析

    这篇博文将深入探讨Android中的XML解析机制,包括DOM、SAX和Pull解析器三种主要方法。 首先,我们来看DOM解析。DOM(Document Object Model)是一种将XML文档加载到内存中并创建一个树形结构的方法。通过DOM解析,...

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

    本文将深入探讨如何在Android中使用两种常见的XML解析技术——SAX(Simple API for XML)和PULL(Pull Parser)来解析天气预报的XML数据。这两种方法各有优缺点,适用于不同的场景。 首先,我们来看SAX解析器。SAX...

    android解析XML文件样例SAX方法

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式,以流式处理XML文档,适合处理大型XML文件,因为它不需要一次性加载整个文档到内存中。本篇文章将详细介绍如何在Android平台上使用SAX方法解析...

    android sax解析xml模板源码下载

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动模型,以流式的方式处理XML文档,对内存的占用较小,适合处理大型XML文件。本示例"android sax解析xml模板源码"提供了一个使用SAX解析XML的实例,方便...

    android xml多种解析生成

    Android 中提供了多种 XML 解析方法,包括 SAX、DOM 和 Pull 解析器。 * SAX(Simple API for XML)解析器是一种基于事件的解析器,它可以将 XML 文件解析为一系列事件,然后使用回调函数处理这些事件。SAX 解析器...

Global site tag (gtag.js) - Google Analytics