`

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文件内容 附

    本篇文章将详细介绍如何利用SAX解析器来读取XML文件内容,这是一种轻量级、事件驱动的解析方式,特别适合处理大文件。 SAX(Simple API for XML)解析器在读取XML文件时,不会一次性加载整个文件到内存,而是逐行或...

    android 使用Sax解析XML 源码实例

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

    QT使用SAX读取xml高效-快速.rar

    QT使用SAX读取xml高效-快速.rar SAX(Simple API for XML) 如果你只想读取并显示整个XML文档,那么SAX是很好的选择,因为它提供了比DOM更简单的接口,并且它不需要将整个XML文档一次性读入内存,这样便可以用来读取...

    [Android]使用SAX解析XML文件

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

    SAX解析xml文件源码

    相较于DOM解析,SAX解析不将整个XML文档加载到内存中,而是采用事件驱动的方式,逐行读取并处理XML内容,因此在处理大型XML文件时更为高效。下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下...

    使用SAX读取XML文件

    本文将深入探讨如何使用SAX(Simple API for XML)解析器来读取XML文件,这是一种基于事件驱动的解析方式,非常适合处理大型或内存受限的环境。 SAX解析器不同于DOM(Document Object Model)解析器,DOM会将整个...

    android sax解析xml模板源码下载

    在Android环境中,由于内存限制,SAX解析器特别适用于处理大型XML文件,因为它只在需要时读取和处理XML的一部分,而不是一次性加载整个文件到内存。这使得SAX解析在资源管理方面更为高效。 这个"android sax解析xml...

    android sax解析xml文件

    以下是一个简单的SAX解析XML文件的Android实例源码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxExample extends ...

    Android读取XML文件(SAX)

    下面我们将详细讨论如何在Android环境中使用SAX解析XML文件。 一、SAX解析原理 SAX解析器按照XML文档的顺序逐个读取元素,当遇到元素开始、结束、属性、文本等事件时,会触发相应的回调函数。开发者需要实现`...

    android使用pull 解析xml文件源码

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

    xml文件读取实例源码

    XML(eXtensible Markup Language)是一种用于...总的来说,XML文件读取实例源码涵盖了XML解析、DOM模型的使用以及错误处理等核心概念。通过学习和实践这样的实例,开发者可以更好地理解和掌握XML在实际项目中的应用。

    SAX解析XML文档的初级源码

    SAX解析器是一种基于事件驱动的解析方式,它以流式读取XML文档,逐个处理XML元素,而不是一次性加载整个文档到内存中。这种方式特别适合处理大型XML文件,因为它的内存占用较低。以下我们将详细讲解SAX解析XML的基本...

    android sax解析创建xml源码

    SAX解析常用于网络数据传输、文件读取等场景,特别是当XML文件过大,不适合一次性加载到内存时,SAX解析是一个很好的选择。 在提供的压缩包文件"SaxParseXml"中,可能包含了示例代码或完整的解析项目,帮助开发者更...

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

    SAX解析器在读取XML文档时,会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者需要定义一个ContentHandler类来处理这些事件,当解析器遇到相应的XML元素时,就会调用ContentHandler中的方法...

    android_sax_xml

    本篇将深入探讨如何在Android中使用SAX解析XML,以及它与源码和工具的相关性。 **一、SAX解析的基本原理** SAX解析器读取XML文档时,会逐行扫描并触发一系列的事件回调,如开始元素、结束元素、字符数据等。开发者...

    SAX解析XML源码

    本篇主要探讨的是SAX解析XML的源码实现。 SAX解析器是一种事件驱动的解析器,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到XML文档中的元素、属性、文本等时,会触发相应的回调函数。这种方式非常适合...

    android xml文件解析 SAX

    在Android开发中,XML文件广泛用于存储数据和配置信息,如布局、字符串资源、颜色等。解析XML文件是Android开发者必须掌握的一项技能。本篇将详细介绍Android中的SAX(Simple API for XML)解析方式。 SAX是一种...

    java中读写XML文件

    在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。

    易语言 xml解析 易语言 xml解析 教程 带源码

    SAX解析器则是事件驱动的,逐行读取XML,适合处理大型文件。 3. **DOM解析**:使用DOM解析,我们可以获取XML文档的节点信息,包括根节点、子节点、属性等,并能对它们进行操作。例如,通过`创建XML文档对象`、`加载...

    Android XML解析——Sax解析XML

    本篇文章将重点讨论Android中的SAX(Simple API for XML)解析器,这是一种事件驱动的解析方法,适合处理大文件或内存有限的设备。 ### SAX解析原理 SAX解析器以流式方式读取XML文档,遇到元素、属性等结构时会触发...

Global site tag (gtag.js) - Google Analytics