数据存储(两)--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
版权声明:本文博客原创文章。博客,未经同意,不得转载。
数据存储(两)--SAX发动机XML记忆(附Demo)的更多相关文章
- 16_Android的数据存储_ SharedPreference、XML和JSON
1. Android读写首选项 1.1 SharedPreferences SharedPreferences 是一种轻型的数据存储方式,它的本质是基于XML文件存储Key-Value键值对数据,通常 ...
- 数据的持久性存储(二)——CoreData(附Demo)
CoreData是一款稳定.功能全面的持久性工具.(本文参考iphone开发3所写,比较简要,需详细了解可以参考iphone开发3) 首先创建一个新的项目CoraData,记得勾选Use Core D ...
- iOS应用数据存储的常用方式
iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer: ...
- Android中数据存储(四)——ContentProvider存储数据
目录(?)[+] 当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方 ...
- Android中数据存储(三)——SQLite数据库存储数据
当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方式: 1. Share ...
- ios开发之数据存储
iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...
- iOS本地数据存储(转载)
看到一篇不错的文章,推荐给大家!!! 应用沙盒 1)每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 2)应用沙盒的文 ...
- Android数据存储三剑客——SharedPreferences、File、SQLite
Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...
- iOS学习笔记--数据存储
iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XM ...
随机推荐
- J2SE基础:4.面向对象的特性一
面向对象的特性 封装 继承多态 封装: 定义: 通过对象的封装,实现了模块化和信息隐藏. 通过对类的成员施以一定的訪问权限,实现了类中成员 的信息隐藏 注意点: 对象自已该做的一些事情与方法不能交与其 ...
- 线性表实现简单vector
实现一个简单的vector Vector基于数组实现,可以复制并且其占用的内存可以自动回收(通过析构函数),可以调整Vector的大小,以及容量(容量的改变是通过为基本数组分配一个新的内存块,然后复制 ...
- 精致的外观Request
为什么要说Request精致的外观?请注意,我们这里所说的并不总是理解含义的外观门面,事实上,它使用的立面设计图案.使用的主要考虑数据安全的门面.它涉及到一个更大的系统系统的多个子系统之间的互动沟通. ...
- Matlab强迫症产生的图像
最近流行的网络迷恋的照片做头像,闲来无事,取matlab获取一个建设者,它可以产生包括0-9以及99+OCD. 原理很easy,图叠加,这里为了降低文件,将数字图片保存在.mat二进制文件里. === ...
- JAVA基础编程50题(10-12题)具体解释
一.描写叙述 1.一球从m米高度自由落下.每次落地后反跳回原高度的一半:再落下,求它在 第n次落地时.共经过多少米?第10次反弹多高? 2.有1.2.3.4个数字.能组成多少个互不同样且无反复数字的三 ...
- redmine忘记username和password
环境: Ubuntu 13.10 bitnami-redmine-2.5.1-1-linux-x64-installer.run 用bitnami安装完redmine以后,有是否忘记了username ...
- Xcode 凝视代码
#pragma mark ---------------凝视信息-------------------- -(void)RequestSP { // MARK: 凝视信息 // TODO: 凝视信息 ...
- URAL 1553. Caves and Tunnels 树链拆分
一颗树 每次出发点右键值是0 2操作模式1.第一i右键点值添加x 2.乞讨u至v在这条路上右上方值 树为主的连锁分裂称号 #include <cstdio> #include <cs ...
- 使用autoconf和automake生成Makefile文件(转)
Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...
- maple 教程
1 初识计算机代数系统Maple 1.1 Maple简说 1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 開始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目 ...