Android(安卓)XMl文件存储及其解析
16lz
2021-01-26
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
更多相关文章
- 如何在xml中直接添加view点击监听(参考rayleung博客)
- Android实现侧滑菜单
- android keystore文件转换格式为pk8和x509.pem
- Android常见UI组件之ListView(二)——定制ListView
- android JNI utils/Log.h 找不到 解决方法
- Android中加载PNG图片时出现错误----No resource found
- Android(安卓)HttpClient 与JSON解析
- Android(安卓)NestedScroll嵌套滑动机制解析
- 获取一个app的package名和activity名