数据存储(两)--SAX发动机XML记忆(附Demo)

Android SDK支撑SAX读取技术XML,SAX通过连续的读取方式来处理XML文件。这要求每个读数XML对应的事件触发,以处理该节点的文件的节点。以下是基于一个例子来告诉SAX使用:

public class Book
{
	private String name;
	private String id;
	private String price;
	private String publisher;
	private int count;
    .... get,set方法省略
}

XML文件例如以下:

<?xml version="1.0" encoding="utf-8"?>
<books  xmlns:book="http://schemas.android.com/com.example.jsonxmlio">
    <book
        book:name="语文"
        book:id="001"
       	book:price="45"
       	book:publisher="A">12</book>
    <book
        book:name="数学"
        book:id="002"
       	book:price="50"
       	book:publisher="B">10</book>
    <book
        book:name="英语"
        book:id="003"
       	book:price="55"
       	book:publisher="C">21</book>
</books>

XMLTool.java

1.构建一个工厂SAXParserFactory

2.构建并实例化SAXPraser对象

public class XMLTool {

	private static SAXParser getSAXParser() throws ParserConfigurationException, SAXException
	{
        SAXParserFactory parserFactory = SAXParserFactory.newInstance();
        return parserFactory.newSAXParser();
	}
	public static DefaultHandler parse(InputStream inStream,DefaultHandler handler){
		if(inStream!=null){
			try {
				SAXParser parser = getSAXParser();
				parser.parse(inStream, handler);
				return handler;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				if(inStream!=null){
					try {
						inStream.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		return null;
	}
}

BookXMLParser.java

public class BookXMLParser extends DefaultHandler
{

	private ArrayList<Book> dataList;
	private Book book;
	private StringBuffer stringBuffer = new StringBuffer();
	//private StringBuffer buffer=new StringBuffer();

	public ArrayList<Book> getData()
	{
		return dataList;
	}

	public void startDocument() throws SAXException
	{
		// TODO Auto-generated method stub
		dataList = new ArrayList<Book>();
	}

	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException
	{
		// TODO Auto-generated method stub
		if(qName.equals("book"))
		{
			book = new Book();
			book.setName(attributes.getValue("book:name"));
			book.setId(attributes.getValue("book:id"));
			book.setPrice(attributes.getValue("book:price"));
			book.setPublisher(attributes.getValue("book:publisher"));

		}
		super.startElement(uri, localName, qName, attributes);
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		stringBuffer.append(ch,start,length);
		super.characters(ch, start, length);
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		if(qName.equals("book"))
		{
			if(stringBuffer.toString()!=null && !stringBuffer.toString().equals(""))
			{
				book.setCount(Integer.parseInt(stringBuffer.toString().trim()));
				stringBuffer.setLength(0);//必须清空缓冲区
			}
			dataList.add(book);

		}
		super.endElement(uri, localName, qName);
	}
}

SAX引擎须要处理5个分析点,也能够称为分析事件。

1.開始分析XML文件。

该分析点表示SAX引擎刚刚開始处理XML文件。可是还没有读取XML文件里的内容,该分析点相应:

public void startDocument() throws SAXException
	{
		// TODO Auto-generated method stub
		dataList = new ArrayList<Book>();
	}

在此方法里面能够做一些初始化的工作。

2.開始处理每个XML元素。

也就是遇到<book>这种起始标记的时候都会触发这个分析节点,所相应的事件方法是startElement。在这个节点能够获得元素的名称、属性的相关信息。

public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException
	{
		// TODO Auto-generated method stub
		if(qName.equals("book"))
		{
			book = new Book();
			book.setName(attributes.getValue("book:name"));
			book.setId(attributes.getValue("book:id"));
			book.setPrice(attributes.getValue("book:price"));
			book.setPublisher(attributes.getValue("book:publisher"));
		}
		super.startElement(uri, localName, qName, attributes);
	}

3.处理完每个XML元素。

也就是遇到</book>这种结束标记的时候会触发endElement方法。在该事件中能够获得当前处理完元素的所有信息。

	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		if(qName.equals("book"))
		{
			if(stringBuffer.toString()!=null && !stringBuffer.toString().equals(""))
			{
				book.setCount(Integer.parseInt(stringBuffer.toString().trim()));
				stringBuffer.setLength(0);//必须清空缓冲区
			}
			dataList.add(book);
		}
		super.endElement(uri, localName, qName);
	}

4.处理完XML文件。假设SAX引擎将整个XML文件所有扫描完就会出发endDocument方法。这种方法可能不是必须的,但在这种方法中能够完毕一些收尾工作。比方说释放资源等。在该例中我没有使用。

5.读取字符分析点。

这是一个非常重要的分析点。

假设没有这个分析点。 前面的工作相当于白做,尽管扫描了XML文件,可是没有保存.....而这个分析点所相应的characters事件方法的主要作用就是保存SAX读取的XML文件内容。

详细的说就是<book ...  ...>12</book>中的“12”

public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		stringBuffer.append(ch,start,length);
		super.characters(ch, start, length);
	}

使用SAX解析XML:

public class MainActivity extends Activity
{
	private List<Book> books;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		InputStream inStream = getResources().openRawResource(R.raw.books);
		BookXMLParser parser = new BookXMLParser();
		books = ((BookXMLParser)XMLTool.parse(inStream, parser)).getData();

		if(books!=null && books.size()>0)
		{
			for(int i = 0;i<books.size();i++)
			{
				Log.d("AAA", books.get(i).toString());
			}
		}
	}
}

写XML文件

public static void WriteXML(List<Book> books, OutputStream out) throws Exception
	{
        XmlSerializer serializer = Xml.newSerializer();
        serializer.setOutput(out, "UTF-8");
        serializer.startDocument("UTF-8", true);
        serializer.startTag(null, "books");
        for (Book book : books)
        {
            serializer.startTag(null, "book");
            serializer.attribute(null, "book:name", book.getName());
            serializer.attribute(null, "book:id",book.getId());
            serializer.attribute(null, "book:price", book.getPrice());
            serializer.attribute(null, "book:publisher",book.getPublisher());
            serializer.text(String.valueOf(book.getCount()));
            serializer.endTag(null, "book");
        }
        serializer.endTag(null, "books");
        serializer.endDocument();
        out.flush();
        out.close();
    }

Demo:http://download.csdn.net/detail/tangnengwu/7664719

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-11-01 11:21:44

数据存储(两)--SAX发动机XML记忆(附Demo)的相关文章

16_Android的数据存储_ SharedPreference、XML和JSON

1. Android读写首选项 1.1 SharedPreferences SharedPreferences 是一种轻型的数据存储方式,它的本质是基于XML文件存储Key-Value键值对数据,通常用来存储一些简单的配置信息,其存储位置在/data/data/<包名>/shared_prefs目录下. SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现.本例程讲解 SharedPreference 数据的读写操作. 1 package

Android 测试、数据存储与访问、XML解析与生成

1.android测试 1.黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的. 2. 白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试. 3.单元测试: 又称模块测试,是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 4.功能测试: 根据产品特性.操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求. 5.压力测试: 主体向被观察者布置一定量任务和作业,借以观察个体完成任务的行为. 6.集成测试: 是单元

第6章 数据存储全方案,详解持久化技术

第6章 数据存储全方案,详解持久化技术 所有的App都可以说是与数据打交道的,离开数据它们什么都不是.那么平时我们怎么存储一些关键的数据呢? 1 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换. Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件

IOS中数据存储 sqlite3 的应用, 知识点: 数据库句柄 , 单例模式运用, Services服务层,sqlite3_open, sqlite3_exec, sqlite3_prepare_v2,sqlite3_step等等

相比于服务器端的数据存储,IOS中几种数据存储的技术: (1)XML属性列表 -- PList (2)NSKeyedArchiver 归档 (3)Preference(偏好设置) (4)SQLite3 (5)Core Data(以面向对象的方式操作数据库SQLite) 发现用数据库进行数据的存储和缓存,才是王道, 比较有心得的体会:虽然通过文件的方式进行存储,读写速度相对数据库存储较快,但是涉及大批量的数据时,在查询/管理/优化方面,数据库的优势明显会更大些.而且作为移动端,SQLite数据库在

ios开发之数据存储

iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer) 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本)/Users/apple/Li

黑马程序员_iOS应用数据存储-学习总结

iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档 SQLite3 Core Data 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 沙盒的结构: 应用程序包:包含了所有的资源文件和可执行文件 Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该

Android数据存储

Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存储之SharedPreferences: SharedPreferences位于android.content包中,用于存储少量简单数据.其特点有: 1. 轻型的数据存储方式 2. 基于xml文件的存储方式,以 键/值 对的形式存储数据 3. 存储简单的配置信息,支持的存储类型有:Boolean.F

Android数据存储之SharedPreferences

SharedPreferences是一种轻型的数据存储方式,基于XML文件存储key-value pairs键值对数据,通常用来存储一些简单的配置信息.SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现.每一个 SharedPreferences 文件都是由framework管理的并且可以是私有或者可共享的. 数据存储 新建一个Android项目,在MainActivity的onCreate方法中,调用getSharedPreferenc

iOS 数据存储 - 01基本介绍

1.应用沙盒 sandbox 1. 什么是沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 2.应用沙盒结构 应用程序包: 包含了所有的 资源文件和 可执行文件 Documents: 保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录.保存相对重要的数据 tmp: 保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除.应用没有运行时