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 ...
随机推荐
- crontab配置
1.命令功能 通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本.时间间隔的单位可以是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的 ...
- android开发常用地址
一. android市场占用率的url http://developer.android.com/about/dashboards/ 二. ADT下载 下载地址是:http://developer.a ...
- [Tools] Deploy a Monorepo to Now V2
Now by Zeit has recently been updated and now supports multi-language monorepos. In this lesson we'l ...
- [Angular] ngPlural
The usecase is very simple: <div [ngPlural]="items.length"> <ng-template ngPlural ...
- FolderBrowserDialog 关于设置为单线程单元(STA)模式的问题
当Main函数是这样的状态的时候,当打开FolderBrowserDialog控件的时候 ,报错 这里有两种解决办法,第一种,就是把main 上加[STAThread] 第二种是启用一个线程 Thre ...
- JavaScript对象浅复制
1.概述 Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). 注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面 ...
- js:获得时间
<script type="text/javascript"> function bodyLoad() { var dateTime = new Date(); var ...
- bios文字解释
很多笔记本电脑用户由于不熟悉bios,导致在需要设置bios时不知如何下手,其实bios基本大同小异,熟悉了以后再遇到bios设置就手到擒来了. 今天我们以笔记本电脑为例,进行bios界面的解读. 1 ...
- IBM Rational AppScan使用详细说明
转自:http://www.nxadmin.com/tools/675.html 本文将详细介绍Appscan功能选项设置的细节,适合E文一般,初次接触Appscan的童鞋参考阅读. Appscan是 ...
- CentOS修改IP地址及关闭/打开防火墙
1.CentOS修改IP地址: # ifconfig eth0 192.168.1.80 这样就把IP地址修改为192.168.1.80(如果发现上不了网 了,那么你可能需要把网关和DNS也改一下,后 ...