Android XMl文件存储及其解析

在Android中有许多数据要以文件的形式保存到本地,那么怎么以xml格式的形式来保存文件呢?

使用StringBuffer拼接字符串(不推荐)

因为demo过于简单,就直接粘贴源码:

import java.io.File;import java.io.FileOutputStream;import java.util.ArrayList;class my {public static void main(String[] args) {        initData();}  private static void initData() {    File file = new File("C:\\Users\\xcq\\Desktop\\test\\my.xml");//这里是我的路径    ArrayList mList = new ArrayList();    try {          FileOutputStream fis = new FileOutputStream(file);        for (int i =0 ;i<10;i++){         Bean bean =  new Bean("张"+i,"男",System.currentTimeMillis() );         mList.add(bean);        }        StringBuilder sb = new StringBuilder();        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");        sb.append("");        for (int i = 0; i < mList.size(); i++) {            sb.append("");            sb.append("");            sb.append(mList.get(i).getName());            sb.append("");            sb.append("");            sb.append(mList.get(i).getSex());            sb.append("");            sb.append("");            sb.append(mList.get(i).getDate());            sb.append("");            sb.append("");        }        sb.append("");        fis.write(sb.toString().getBytes());        fis.close();    } catch (Exception e) {        e.printStackTrace();    }}static class Bean{    private  String  name;    private  String sex;    private long date;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public long getDate() {        return date;    }    public void setDate(long date) {        this.date = date;    }    public Bean(String name, String sex, long date) {        this.name = name;        this.sex = sex;        this.date = date;    }}}

执行完后的效果:

虽然这种方法能够生成xml文件,但是我们不推荐使用,因为如果在某个标签下,他的内容是这个标签就会出错比如
这个标签下,我的内容为,显然这种就无法解析。

使用XMl序列化器生成xml文件(推荐)

Dmeo在后面;

     private void createMetod() {    // 得到xml序列化器对象    XmlSerializer xmlSerializer = Xml.newSerializer();    //给序列化器设置输出流    File file = new File(getFilesDir().getAbsolutePath() + "my.xml");    try {        FileOutputStream fos = new FileOutputStream(file);        //给序列化器指定好输出流        xmlSerializer.setOutput(fos, "utf-8");//这个utf-8的作用,是指定xml文件用什么编码生成        xmlSerializer.startDocument("utf-8", true);//这个utf-8的作用,指定的是头结点中encoding这个属性的值        xmlSerializer.startTag(null, "student");        //根节点的开始标签        xmlSerializer.startTag(null, "name");        xmlSerializer.text("张三");        //根节点的结束标签        xmlSerializer.endTag(null,"name");        xmlSerializer.startTag(null, "age");        xmlSerializer.text("12");        xmlSerializer.endTag(null,"age");        xmlSerializer.startTag(null, "addr");        xmlSerializer.text("北京");        xmlSerializer.endTag(null,"addr");        xmlSerializer.endTag(null, "student");        //生成尾节点,告诉序列化器,文件生成完毕        xmlSerializer.endDocument();    } catch (Exception e) {        e.printStackTrace();    }}

xmlSerializer.startDocument(“utf-8”, true);

这个utf-8的作用,指定的是头结点中encoding这个属性的值,后一个参数standalone,表示是否为独立的xml文件

xmlSerializer.startTag(null, “name”);

第一个参数是命名空间,类似于 android:layout_width=”match_parent”,前面的android,
这里就赋值为null,第二个参数为根节点名称。

运行之后我们就可以在data/data/mydemo.com.xmlcreate/files中查看到my.xml文件了

xml的解析

xml解析有4种方式:Dom,Dom4J,SAX,PUll

Dom:会把整篇文档加载到内存中,在Android里我们不推荐使用。

Dom4j:会导入jar包

SAX和pull:加载一行解析一行,以事件类型作为驱动。google推荐使用pull解析,因此我们使用pull进行解析。

//xml 解析private void jiexiMethod() {    File file = new File(getFilesDir().getAbsolutePath() + "/my.xml");    try {        FileInputStream fis = new FileInputStream(file);        //获取Xml的pull解析器        XmlPullParser xp = Xml.newPullParser();        //指定使用什么编码去解析xml文件        xp.setInput(fis,"utf-8");        //开始解析        //需要判断当前解析到什么标签,因为解析到不同的标签需要做不同的操作        //通过获取当前标签的事件类型        int type = xp.getEventType();        while (type!=XmlPullParser.END_DOCUMENT){          switch (type){              case  XmlPullParser.START_TAG:                if("student".equals(xp.getName())){//获取当前标签的名字                   mList = new ArrayList();                    bean =new Bean();                }else if("name".equals(xp.getName())){                    String name = xp.nextText();//获取当前节点的下一个节点的文本,并把指针移动至当前节点的结束节点                    bean.setName(name);                }else if("age".equals(xp.getName())){                    String age = xp.nextText();                    bean.setAge(age);                }else if("addr".equals(xp.getName())){                    String addr = xp.nextText();                    bean.setAddr(addr);                }                  break;              case XmlPullParser.END_TAG:                  if("student".equals(xp.getName())){                      mList.add(bean);                  }                  break;          }        //指针移动至下一个节点,并且获取它的事件类型        type = xp.next();    }    //解析结果        for (int i = 0; i < mList.size(); i++) {            Log.e("mlist",mList.toString());        }    } catch (Exception e) {    }}

相关Demo

更多相关文章

  1. 如何在xml中直接添加view点击监听(参考rayleung博客)
  2. Android实现侧滑菜单
  3. android keystore文件转换格式为pk8和x509.pem
  4. Android常见UI组件之ListView(二)——定制ListView
  5. android JNI utils/Log.h 找不到 解决方法
  6. Android中加载PNG图片时出现错误----No resource found
  7. Android(安卓)HttpClient 与JSON解析
  8. Android(安卓)NestedScroll嵌套滑动机制解析
  9. 获取一个app的package名和activity名

随机推荐

  1. 丰富多彩的Android(安卓)onTouch事件
  2. 丰富多彩的Android(安卓)onTouch事件
  3. Android关于图片压缩
  4. 相对布局RelativeLayout
  5. 安卓开发---进度条
  6. android EditText 实现搜索框点击搜索隐
  7. mac 下 android studio 识别不出真机
  8. Android(安卓)Service总结06 之AIDL
  9. Android学习笔记之mainfest文件中android
  10. android中获取当前程序路径