在Android中有许多数据要以文件的形式保存到本地,那么怎么以xml格式的形式来保存文件呢?
因为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("");
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文件,但是我们不推荐使用,因为如果在某个标签下,他的内容是这个标签就会出错比如
这个标签下,我的内容为,显然这种就无法解析。
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解析有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