Android XMl文件存储及其解析

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<Bean> mList = new ArrayList<Bean>();
    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("<student>");

        for (int i = 0; i < mList.size(); i++) {
            sb.append("<body>");


            sb.append("<name>");
            sb.append(mList.get(i).getName());
            sb.append("</name>");


            sb.append("<sex>");
            sb.append(mList.get(i).getSex());
            sb.append("</sex>");


            sb.append("<date>");
            sb.append(mList.get(i).getDate());
            sb.append("</date>");


            sb.append("</body>");
        }

        sb.append("</student>");
        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>();
                    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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值