android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化
Android内置了PULL解析器的XPP3实现,以及SAX解析器等,可以直接使用PULL或SAX解析XML,直接把JAVA中进行PULL或SAX解析的代码直接拿来用,遗忘的话,可以参考java拾遗1,2,3关于XML的解析:
如有如下XmlUtils类实现PULL方式解析XML到List和序列化List到XML:
Student实体类代码:
package cn.csc.bean; public class Student { private String id; private String name; private String gender; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student() { super(); } public Student(String id, String name, String gender, int age) { super(); this.id = id; this.name = name; this.gender = gender; this.age = age; } @Override public String toString() { return "["+id+","+name+","+gender+","+age+"]"; } }
XmlUtils类的代码:
public class XmlUtils { public static void serialize(Context context, String filename, List<Student> list){ try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlSerializer serializer = factory.newSerializer(); serializer.setOutput(context.openFileOutput(filename, Context.MODE_PRIVATE), "utf-8"); serializer.startDocument("utf-8", true); serializer.startTag(null, "students"); for(Student s:list){ serializer.startTag(null, "student"); serializer.attribute(null, "id", s.getId()); serializer.startTag(null, "name"); serializer.text(s.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "gender"); serializer.text(s.getGender()); serializer.endTag(null, "gender"); serializer.startTag(null, "age"); serializer.text(s.getAge()+""); serializer.endTag(null, "age"); serializer.endTag(null, "student"); } serializer.endTag(null, "students"); serializer.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static List<Student> parse(Context context, String filename){ List<Student> list = new ArrayList<Student>(); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(context.openFileInput(filename), "utf-8"); Student s = null; int eventType = parser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT){ if(eventType == XmlPullParser.START_TAG){ String tag = parser.getName(); if(tag.equals("student")){ s = new Student(); s.setId(parser.getAttributeValue(0)); }else if(tag.equals("name")){ s.setName(parser.nextText()); }else if(tag.equals("gender")){ s.setGender(parser.nextText()); }else if(tag.equals("age")){ s.setAge(Integer.parseInt(parser.nextText())); } }else if(eventType == XmlPullParser.END_TAG && parser.getName().equals("student")){ list.add(s); } eventType = parser.next(); } for(Student stu : list){ Log.i("XML_PARSER",stu.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } return list; } }
使用Android Juit分别测试这两个方法:
public class XmlTest extends AndroidTestCase { public void testSerializer(){ List<Student> list = new ArrayList<Student>(); for(int i=0; i<20; i++){ list.add(new Student(i+"","dqrcsc","male",25)); } XmlUtils.serialize(getContext(), "students.xml", list); } public void testParser(){ XmlUtils.parse(getContext(), "students.xml"); } }
运行结果:
以上代码,除了获取Context上下文对象外,与Java项目中对XML的PULL解析是完全一样的。
实际上,Andoid在android.util包中还提供了一个Xml类,实现了对XML解析、序列化操作的封装,在使用时,可以相对简单一点:
这五个静态方法分别简化了PULL解析器、PULL序列化器、SAX解析的操作:
之前通过工厂类实例获取PULL序列化器的操作,可以从:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlSerializer serializer = factory.newSerializer();
简化为:
XmlSerializer serializer = Xml.newSerializer();
通过工厂类实例获取PULL解析器的操作,也可以从:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser();
简化为:
XmlPullParser parser = Xml.newPullParser();
同样的,SAX解析也简化为直接调用Xml的parse()静态方法,这里就不说明了。
android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化的更多相关文章
- 把数据存储到 XML 文件
通常,我们在数据库中存储数据.不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中. 创建并保存 XML 文件 如果数据要被传送到非 Windows 平台上的应用程序,那么把数据保存在 ...
- android菜鸟学习笔记17----Android数据存储(一)文件读写
假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...
- android菜鸟学习笔记18----Android数据存储(二)SharedPreferences
数据存储的方式,有比直接文件读写更加简便的方式,那就是操作SharedPreferences. SharedPreferences一般用于存储用户的偏好设定,暂时不支持多进程操作. SharedPre ...
- android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据
主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...
- android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人
要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...
- android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用
ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentPro ...
- android菜鸟学习笔记16----Android项目打包安装过程(Run as Android Application)
右击项目名称,Run as Android Appication之后,Android项目打包安装过程: 1.打包生成.apk文件: 1)把源码中的.java文件编译生成.class文件 2)将所有的. ...
- android菜鸟学习笔记14----Android控件(三) ListView的简单使用
MVC模式: MVC的基本原理就是通过Controller连接View和Model.当View中所显示的数据发生变化时,会通知Controller,然后由Controller调用Model中的相关方法 ...
- android菜鸟学习笔记10----Intent及<intent-filter>
关于Bundle: 注意到Activity的onCreate()方法的签名是protected void onCreate(Bundle savedInstanceState),其参数是一个Bundl ...
随机推荐
- 新人补钙系列教程之:AS3 位运算符
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...
- GridView后台绑定数据列表方法
在很多时候数据绑定都是知道了数据表中的表字段来绑定GridView控件的,那时候我就有个想法希望通过表明来查询数据库中的字段来动态的绑定GirdView控件数据并提供了相关的操作列,在网上找了一些资料 ...
- [Debug] Diagnose a Slow Page Using Developer Tools
Your page is showing high CPU usage and spinning up your laptop fan, but nothing is visibly happenin ...
- hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询
紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前 ...
- OSQL.EXE 命令行下脱裤mssql
cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ OSQL.EXE -S "localhost" -U " ...
- vscode - emmet失效?
把emmet设置覆盖为用户.
- 浏览器网页推断手机是否安装IOS/Androidclient程序
IOS 原理例如以下: 为HTML页面中的超链接点击事件添加一个setTimeout方法. 假设在iPhone上面500ms内,本机有应用程序能解析这个协议并打开程序,则这个回调方法失效. 假设本机没 ...
- poj Muddy Fields
Muddy Fields 原题去我创的专题里找,在文件夹首页. 题目: 给出N*M矩阵.当中*表示泥土,.表示小草.要你用最少的木板把泥土覆盖. 木板长度不限.可是仅仅能水平和竖直. 行列式二分匹配配 ...
- 【HTML5】元素<script>与<noscript>的使用
功能描述 在新建的页面中增加一个文本框"txtContent"和一个按钮"请点击我":当单击按钮时.通过页面中加入的JavaScript脚本获取为文本框中的内容 ...
- zabbix监控sockets连接数
配置zabbix客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf 添加 Include=/etc/zabbix/zabbix_agentd.d/ 添加脚本对soc ...