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. 摄像头bug查找工作总结

    近期花了很长时间在libcamera中查找和解决一个bug.下面将这段时间中的工作过程,以及对camera的认识总结如下: 首先是问题的发生,在UM2801中,摄像头的代码已经基本实现,并且相应功能也 ...

  2. Linux&Windows下批量修改文件后缀

    Linux下从给定文件夹中找出小于1M的文件,并批量添加.gif后缀 先看一下文件夹下的目录的格式 ll -Sh -rw-rw-r-- 1 yangkun yangkun 17M May 10 15: ...

  3. java gc log

    java full gc 经常带来延迟, 导致性能问题 如下命令使java虚拟机记录gc的log到文件, 帮助分析定位问题. java -Xloggc:./a.log -jar a.jar    // ...

  4. 2017.7.25 jqGrid在编辑态无法获取数据,得到的是html代码

    页面如下: 勾选555之后,点击下方的删除按钮,调用如下代码: 最终调用的是jqGrid的getRowData()方法: 但是运行时发现,无法获取key的值,也就无法正确删除了.获取到的是html代码 ...

  5. [Tools] Support VS Code Navigation and Autocomplete Based on Webpack Aliases with jsconfig.json

    It's common to setup Webpack aliases to make imports much more convenient, but then you lose the abi ...

  6. Linux——Django 开发环境部署(二)python版本控制器pyenv

    python版本控制器pyenv 之前的 那篇是说明了django环境的site package完全独立出来了,但是使用的python解释器还是系统的,为了继续独立出来,甚至是达到ruby的rvm的自 ...

  7. POJ 3687:Labeling Balls(优先队列+拓扑排序)

    id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10178 Acc ...

  8. linux常用命令(个人学习笔记)

    个人说明:学习linux也有半年左右的时间了,从一开始的只会简单的开关机,到现在的熟悉应用一些简单的命令,还是有些进步的,不过对于我这种菜鸟来说,如果不经常用,发现忘的很快.所以就把在学习过程中遇到的 ...

  9. StringUtils工具类详解

    StringUtils判断字符串大概有四种方法: 下面是 StringUtils 判断是否为空的示例: 判断是否为空,但是要注意,空格不算空,这个最好能不用则不用. StringUtils.isEmp ...

  10. php匿名函数和闭包函数及use关键字传参及Closure匿名函数类

    php闭包函数用use传参有什么意义?答:use引用外层变量,比如全局变量 Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名 ...