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文件的解析及序列化的更多相关文章

  1. 把数据存储到 XML 文件

    通常,我们在数据库中存储数据.不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中. 创建并保存 XML 文件 如果数据要被传送到非 Windows 平台上的应用程序,那么把数据保存在 ...

  2. android菜鸟学习笔记17----Android数据存储(一)文件读写

    假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...

  3. android菜鸟学习笔记18----Android数据存储(二)SharedPreferences

    数据存储的方式,有比直接文件读写更加简便的方式,那就是操作SharedPreferences. SharedPreferences一般用于存储用户的偏好设定,暂时不支持多进程操作. SharedPre ...

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

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

  5. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  6. android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用

    ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentPro ...

  7. android菜鸟学习笔记16----Android项目打包安装过程(Run as Android Application)

    右击项目名称,Run as Android Appication之后,Android项目打包安装过程: 1.打包生成.apk文件: 1)把源码中的.java文件编译生成.class文件 2)将所有的. ...

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

    MVC模式: MVC的基本原理就是通过Controller连接View和Model.当View中所显示的数据发生变化时,会通知Controller,然后由Controller调用Model中的相关方法 ...

  9. android菜鸟学习笔记10----Intent及<intent-filter>

    关于Bundle: 注意到Activity的onCreate()方法的签名是protected void onCreate(Bundle savedInstanceState),其参数是一个Bundl ...

随机推荐

  1. ambari journalnode异常Can't scan a pre-transactional edit log

    今天在删日志文件,不知道删错哪个地方了. 该目录下一直报错,这个日志文件增长很快, /var/log/hadoop/hdfs/ hadoop-hdfs-journalnode-xx.log 先备份/h ...

  2. 【JUnit】Junit命令行执行、参数化执行、Main方法执行

    参考资料: main方法执行:http://stackoverflow.com/questions/2543912/how-do-i-run-junit-tests-from-inside-my-ja ...

  3. selenium的PageObject设计模式

    PageObject设计模式1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 2. web测试时,建议 ...

  4. [PIC32--IDE]使用MPLAB IDE调试

    问题描写叙述 安装好MPLAB IDE后,就能够用来调试自己的PIC32板子,用于应用的开发了. 开发板 手边使用的是Microchip的PIC32 Ethernet Starter Kit II的小 ...

  5. java web中 classpath路径 详解

    在使用ssh等框架开发web程序时配置文件(xml和properties)存放的路径一般为src下,当部署程序时则必须存在于classes路径下,具体如下 src不是classpath, WEB-IN ...

  6. MySQL 系列教程(二) 你不知道的数据库操作

    本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网远程连接法 查看\创建\使用\删除\清空\修改 数据库表(是否可空,默认值,主键,自增,外键) 表内容的增删改查 where条件. ...

  7. 正则表达式---A bytes of python

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑.   给定一个正则表达式和另一个 ...

  8. EFFECTIVE JAVA 第一天 静态工厂方法

    静态工厂方法:(这里指的是就是普通static方法),类可以通过静态工厂方法提供给它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做有几大优势. 在类的实现中使用了API的类被称为 ...

  9. WebService的缓存机制

    分类: .NET ASP 2010-11-13 10:00 849人阅读 评论(0) 收藏 举报 webservicestring数据库nullapplicationweb服务 WebService的 ...

  10. int a[3];中a+1与&amp;a+1差别 -- C

    int a[3]; a 和 &a 的地址一样的. a+1 == a + 1*sizeof(int);跳跃是一个数组元素大小 &a+1 == a + 3*sizeof(int);跳跃是整 ...