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实体类代码:

 1 package cn.csc.bean;
 2
 3 public class Student {
 4
 5       private String id;
 6
 7       private String name;
 8
 9       private String gender;
10
11       private int age;
12
13       public String getId() {
14
15            return id;
16
17       }
18
19       public void setId(String id) {
20
21            this.id = id;
22
23       }
24
25       public String getName() {
26
27            return name;
28
29       }
30
31       public void setName(String name) {
32
33            this.name = name;
34
35       }
36
37       public String getGender() {
38
39            return gender;
40
41       }
42
43       public void setGender(String gender) {
44
45            this.gender = gender;
46
47       }
48
49       public int getAge() {
50
51            return age;
52
53       }
54
55       public void setAge(int age) {
56
57            this.age = age;
58
59       }
60
61
62
63       public Student() {
64
65            super();
66
67       }
68
69       public Student(String id, String name, String gender, int age) {
70
71            super();
72
73            this.id = id;
74
75            this.name = name;
76
77            this.gender = gender;
78
79            this.age = age;
80
81       }
82
83       @Override
84
85       public String toString() {
86
87            return "["+id+","+name+","+gender+","+age+"]";
88
89       }
90
91 }

XmlUtils类的代码:

  1 public class XmlUtils {
  2
  3       public static void serialize(Context context, String filename, List<Student> list){
  4
  5            try {
  6
  7                  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  8
  9                  XmlSerializer serializer = factory.newSerializer();
 10
 11                  serializer.setOutput(context.openFileOutput(filename, Context.MODE_PRIVATE), "utf-8");
 12
 13                  serializer.startDocument("utf-8", true);
 14
 15                  serializer.startTag(null, "students");
 16
 17                  for(Student s:list){
 18
 19                       serializer.startTag(null, "student");
 20
 21                       serializer.attribute(null, "id", s.getId());
 22
 23                       serializer.startTag(null, "name");
 24
 25                       serializer.text(s.getName());
 26
 27                       serializer.endTag(null, "name");
 28
 29                       serializer.startTag(null, "gender");
 30
 31                       serializer.text(s.getGender());
 32
 33                       serializer.endTag(null, "gender");
 34
 35                       serializer.startTag(null, "age");
 36
 37                       serializer.text(s.getAge()+"");
 38
 39                       serializer.endTag(null, "age");
 40
 41                       serializer.endTag(null, "student");
 42
 43                  }
 44
 45                  serializer.endTag(null, "students");
 46
 47                  serializer.endDocument();
 48
 49            } catch (Exception e) {
 50
 51                  // TODO Auto-generated catch block
 52
 53                  e.printStackTrace();
 54
 55            }
 56
 57       }
 58
 59       public static List<Student> parse(Context context, String filename){
 60
 61            List<Student> list = new ArrayList<Student>();
 62
 63            try {
 64
 65                  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
 66
 67                  XmlPullParser parser = factory.newPullParser();
 68
 69                  parser.setInput(context.openFileInput(filename), "utf-8");
 70
 71                  Student s = null;
 72
 73                  int eventType = parser.getEventType();
 74
 75                  while(eventType != XmlPullParser.END_DOCUMENT){
 76
 77                       if(eventType == XmlPullParser.START_TAG){
 78
 79                             String tag = parser.getName();
 80
 81                             if(tag.equals("student")){
 82
 83                                   s = new Student();
 84
 85                                   s.setId(parser.getAttributeValue(0));
 86
 87                             }else if(tag.equals("name")){
 88
 89                                   s.setName(parser.nextText());
 90
 91                             }else if(tag.equals("gender")){
 92
 93                                   s.setGender(parser.nextText());
 94
 95                             }else if(tag.equals("age")){
 96
 97                                   s.setAge(Integer.parseInt(parser.nextText()));
 98
 99                             }
100
101                       }else if(eventType == XmlPullParser.END_TAG && parser.getName().equals("student")){
102
103                             list.add(s);
104
105                       }
106
107                       eventType = parser.next();
108
109                  }
110
111                  for(Student stu : list){
112
113                       Log.i("XML_PARSER",stu.toString());
114
115                  }
116
117            } catch (Exception e) {
118
119                  // TODO Auto-generated catch block
120
121                  e.printStackTrace();
122
123                  return null;
124
125            }
126
127            return list;
128
129       }
130
131 }

使用Android Juit分别测试这两个方法:

 1 public class XmlTest extends AndroidTestCase {
 2
 3       public void testSerializer(){
 4
 5            List<Student> list = new ArrayList<Student>();
 6
 7            for(int i=0; i<20; i++){
 8
 9                  list.add(new Student(i+"","dqrcsc","male",25));
10
11            }
12
13            XmlUtils.serialize(getContext(), "students.xml", list);
14
15       }
16
17       public void testParser(){
18
19            XmlUtils.parse(getContext(), "students.xml");
20
21       }
22
23 }

运行结果:

以上代码,除了获取Context上下文对象外,与Java项目中对XML的PULL解析是完全一样的。

实际上,Andoid在android.util包中还提供了一个Xml类,实现了对XML解析、序列化操作的封装,在使用时,可以相对简单一点:

这五个静态方法分别简化了PULL解析器、PULL序列化器、SAX解析的操作:

之前通过工厂类实例获取PULL序列化器的操作,可以从:

1 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2
3 XmlSerializer serializer = factory.newSerializer();

简化为:

XmlSerializer serializer = Xml.newSerializer();

通过工厂类实例获取PULL解析器的操作,也可以从:

1 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2
3 XmlPullParser parser = factory.newPullParser();

简化为:

XmlPullParser parser = Xml.newPullParser();

同样的,SAX解析也简化为直接调用Xml的parse()静态方法,这里就不说明了。

时间: 2024-10-10 13:19:22

android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化的相关文章

iOS 学习笔记——0005(数据存储)

先发一个练手的小demo,自己写的简略通讯录,已上传至github https://github.com/liaoshaolim/addressBook 1.NSKeyedArchiver:(归档) 这里用一个添加联系人的例子来说明: 注意:归档形式保存数据,需要该对象遵守NSCoding协议,而且对应的必须提供encodeWithCoder和initWithCoder方法 因为归档是一次性的,解压也是一次性的,所以小量的ok,如果量大的话,改一个小地方就要归档或解压全部,效率会比较低 //用一

WebServices学习笔记(四)使用services.xml文件发布WebService

四.使用services.xml文件发布WebService 前面发布webservices所建立的java类都不能有包名,这里用配置文件services.xml搭建能有包名的webservice 首先创建MyService类,在service包下 package service; import javax.jws.WebParam; public class MyService { public String getGreeting(@WebParam(name="name")Str

android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: URL url = new URL(http://10.0.2.2/index.php); openConnection()方法返回一个对指定url的资源的连接.返回类型是URLConnection,但是,由于这里我们一般用的是http协议,所以返回的实际是HttpURLConnection对象,故一

android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结

常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在一个浮动于应用之上的View中显示信息,显示一定的时间间隔后自动消失,不可获得焦点. 最简单的用法就是之前的学习中一直使用的:通过一个静态的makeText()方法返回一个Toast对象,然后调用show()方法. 如: 布局文件添加一个Button: 1 <Button 2 3 android:i

android菜鸟学习笔记8----Activity(二)

关于Activity的生命周期: 下面是Activity整个生命周期中,状态发生变化时所回调的方法,它们对应着Activity完整的生命过程. void  onCreate(Bundle savedInstanceState):Activity被创建时回调 void  onStart()  :在onCreate()或者onRestart()之后被调用,即Activity第一次创建或者从不可见变为可见状态时调用. void  onResume()  :恢复到活动状态时回到,在onStart()之后

android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用

现在有这样一个应用A通过ContentProvider提供自己的数据给其他应用,应用B通过ContentResolver获取应用A中提供的数据,并将其展示在ListView中,而应用C通过ContentResolver修改应用A中的数据,或者添加新的数据.现在的问题是应用C修改A中数据后,应用B的ListView中显示的还是历史数据…… 具体程序如下: ContentProvider和插入数据的应用分别复用上一篇中的两个应用,然后新建一个应用,用于获取ContentProvider中的数据,并在

android菜鸟学习笔记14----Android控件(三) ListView的简单使用

MVC模式: MVC的基本原理就是通过Controller连接View和Model.当View中所显示的数据发生变化时,会通知Controller,然后由Controller调用Model中的相关方法执行相应的数据修改操作.反之,当Model中的数据发生变化时,也会通知Controller,由Controller通知View更新显示内容.如此一来,就使得数据部分与视图部分相分离,任何一方发生改变都不会影响到另一方. 而在android中,MVC的一个常见应用就是ListView显示数据.V代表的

android菜鸟学习笔记31----Android使用百度地图API(二)获取地理位置及地图控制器的简单使用

1.获取当前地理位置: Android中提供了一个LocationManager的类,用于管理地理位置.不能通过构造函数获取该类的实例,而是通过Context的getSystemService(): LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 该类中有几个比较常用的方法: getLastKnownLocation(String provider)用于根据传入的provider

android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图

1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 4)点击右上角的API控制台,没有登录的话会先跳转到登录页面,登录成功之后就进入应用控制台了: 5)点击创建应用: 应用类型选择Android SDK,注意下面的安全码,格式是数字签名+应用包名,中间用分号分隔.数字签名的获得: Eclipse中window->Preferences->Andr