关于Android下,XML文件的生成和解析
1.xml文件的生成
有时候我们有必要将一些配置信息或者用户选择保存的信息存储到手机内存或SD卡上,这个时候我们就要生成一个个的xml文件了。xml文件的生成方式有很多种,本人接触过的是SharedPreferences,以及xml的XmlSerializer,当然你也可以直接用StringBuffer,直接去生成一个字符串然后写到文件中去,但是这种方法会有问题,有时候你的有些字符是会和xml格式冲突的,从而出现错误,导致一些麻烦。所以建议还是用xml的一个API==》XmlSerializer来实现。至于SharedPreferences的话,它的原理是和map差不多的,他会以键值对的形式保存和取出数据,但是当我们的某一个元素上想要添加属性的时候,会有点尴尬。还是重点说一下XmlSerializer吧。
/*XmlSerializer这个api,给我们提供了很好的方法来实现生产xml文件,对于和xml文件有冲突的特殊字符它会自己进行自动转义*/
XmlSerializer xs = Xml.newSerializer();
/*首先我们要生成一个xml文件,所以必须先要搞清楚我们要生成什么编码格式的文件,然后放到哪个流去输出到哪个文件中。所以要先设置输出流和编码*/
xs.setOutput(fos, "utf-8");
/*每个xml文件一开始都是一个声明,这里指定一下编码和是否是独立文件就会自动生成*/
xs.startDocument("utf-8", true);
/*设置开始标签(节点),第一个参数是命名空间,用不到就写null,第二个参数就是名字了*/
xs.startTag(null, "Msgs");
for (Msg msg : Msglist) {
xs.startTag(null, "msg");
/*设置标签上的属性*/
xs.attribute(null, "id", msg.getId() + "");
xs.startTag(null, "name");
/*设置标签的内容*/
xs.text(msg.getName());
xs.endTag(null, "name");
xs.startTag(null, "body");
xs.text(msg.getBody());
xs.endTag(null, "body");
xs.startTag(null, "address");
xs.text(msg.getAddress());
xs.endTag(null, "address");
xs.startTag(null, "type");
xs.text(msg.getType());
xs.endTag(null, "type");
xs.endTag(null, "msg");
}
/*记住每一个标签要有始有终,有开始就要有结束,而且开始和结束的时候名字一定要确保一样的,有时候因为一个字母的误写,产生的错误有时候你很难发现的*/
xs.endTag(null, "Msgs");
/*文档结束*/
xs.endDocument();
*一个xml文件,内容也无非就是文件的头标识,然后是各个标签(节点),标签上有属性,标签里面有内容,标签有开始和结束。
2.既然已经生成了XML文件,那么我们就来解析一下XML文件吧。java中,提供给我们解析XML文件的方法有很多,我们一般导入相应的包就可以了,但是这里Android环境下,我运用的是pull解析 XmlPullParser这个API。
//这里的一个集合和对象是用来将数据封装到bean中,再通过list传出去
List<Msg> list=null;
Msg msg=null;
//先得到一个解析器
XmlPullParser xp= Xml.newPullParser();
//你要解析哪个东西?所以先得有个让我解析的流吧。解析成怎样的编码? utf-8;
xp.setInput(is, "utf-8");
//得到事件类型 例如文档的开始 结束 开始标签 结束标签..
int type = xp.getEventType();
//XmlPullParser定义了很多的常量,每个常量都有对应的值来来描述xml文件中的标签、值、属性等。
//只要你不是文档的末尾,就应该一直解析。不是吗?
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
//当是开始标签的时候,我们会发现 有很多的开始标签。所以要区别一下每一个开始标签做什么事情
case XmlPullParser.START_TAG:
if("Msgs".equals(xp.getName())){
list=new ArrayList<Msg>();
}else if("msg".equals(xp.getName())){
msg=new Msg();
//取标签(节点)上的属性值时,可以根据下标来取 msg.setId(Integer.parseInt(xp.getAttributeValue(0)));
}else if("name".equals(xp.getName())){
msg.setName(xp.nextText());
}else if("body".equals(xp.getName())){
msg.setBody(xp.nextText());
}else if("address".equals(xp.getName())){
msg.setAddress(xp.nextText());
}else if("type".equals(xp.getName())){
msg.setType((xp.nextText()));
}
break;
case XmlPullParser.END_TAG:
//結束标签做什么事情
if("msg".equals(xp.getName())){
list.add(msg);
}
break;
}
//记得一直往下读
type=xp.next();
}
return list;
}
XML文件的生成和解析,Android都给我们提供了很好的API,给我们用来生成xml文件和保存xml文件都提供了很大的帮助。