xml文件的生成和解析

来源:互联网 发布:李涛疯狂淘宝上市 编辑:程序博客网 时间:2024/06/03 05:07
<?xml version=‘1.0’ encoding=‘utf-8' standalone=‘yes'?>  xml文件的头<root>根节点<string name=‘account’> 开始标签    name=‘account 属性haha   文本节点</string>  结束标签<string name=‘password’>123456</string></root>所有的标签 不管是开始标签还是结束标签 都是元素 element

一:xml文件的生成 

1.采用组拼字符串生成xml文件
利用StringBuffer或者StringBuilder  注意特殊字符的转义

//<头>//<info>//<student id='800001'>//<name>张三</name>//<age>18</age>//</student>//</info>
//把数据存成xml文件(跨平台)
try {StringBuffer sb = new StringBuffer();sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes'?>");sb.append("<info>");sb.append("<student id='"+id+"'>");sb.append("<name>"+name+"</name>");sb.append("<age>"+age+"</age>");sb.append("</student>");sb.append("</info>");File file = new File(Environment.getExternalStorageDirectory(),"info.xml");FileOutputStream fos = new FileOutputStream(file);fos.write(sb.toString().getBytes());fos.close();Toast.makeText(this, "保存学生信息成功", 0).show();} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "保存学生信息失败", 0).show();}权限:WRITE_EXTERNAL_STORAGE

2.利用Android序列化(生成)xml文件的api

try {//1.创建一个xml文件的序列化器 XmlSerializer serializer = Xml.newSerializer(); //2.设置文件的输出和编码方式 FileOutputStream os = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"info.xml")); serializer.setOutput(os, "utf-8"); //3.写xml文件的头 serializer.startDocument("utf-8", true); //4.写info节点 第一个参数:命名空间 第二个参数:节点名称 serializer.startTag(null, "info"); //5.写student节点 serializer.startTag(null, "student"); //6.写属性 serializer.attribute(null, "id", id); //7.写name serializer.startTag(null, "name"); serializer.text(name); serializer.endTag(null, "name"); //8.写age serializer.startTag(null, "age"); serializer.text(age); serializer.endTag(null, "age"); serializer.endTag(null, "student"); serializer.endTag(null, "info");//写文件的末尾 serializer.endDocument(); os.close();Toast.makeText(this, "保存学生信息成功", 0).show();} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "保存学生信息失败", 0).show();}
二、xml文件的解析

1.DOM解析  在内存当中生成树状的xml结构
2.Dom4j
3.SAX    基于事件的解析 自上而下的解析
4.pull解析
类似sax解析,不过写起来更加的简单,容易理解,内存开销小,速度快

//解析放在assets里的info.xml文件try {InputStream is = this.getAssets().open("info.xml");//解析info.xml文件//1.得到xml文件的解析器XmlPullParser parser = Xml.newPullParser();//2.设置输入流 和编码parser.setInput(is, "utf-8");//3.解析xml文件,获取当前的事件类型. int type = parser.getEventType();while(type!=XmlPullParser.END_DOCUMENT){System.out.println(parser.getEventType()+"----"+parser.getName());//当前事件节点的名字//移动解析器到下一个节点type = parser.next();}is.close();} catch (Exception e) {e.printStackTrace();}

例子:

<?xml version="1.0" encoding="utf-8" ?> <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">  <string>北京</string>   <string>-5℃/7℃</string>   <string>1月9日 晴转晴</string>   <string>北风3-4级转无持续风向微风</string>   <string>穿衣指数:冷。旅游指数:一般。温度稍低,风稍大,外出注意防风保暖。</string> </ArrayOfString>
try {XmlPullParser parser = Xml.newPullParser();// 设置解析器的参数InputStream is =getAssets().open("getWeatherbyCityName.xml");parser.setInput(is,"utf-8");List<String> infos = new ArrayList<String>();int type = parser.getEventType();while(type!=XmlPullParser.END_DOCUMENT){if(type==XmlPullParser.START_TAG){//当前是开始节点.if("string".equals(parser.getName())){String info = parser.nextText();infos.add(info);}}type = parser.next();//只要不解析到文档的末尾就不停的解析下一个节点}is.close();String cityname = infos.get(0);String temp = infos.get(1);String weather = infos.get(2);String wind = infos.get(3);String wearinfo = infos.get(4);TextView tv = (TextView) findViewById(R.id.tv_info);tv.setText("城市名称:"+cityname+"\n温度:"+temp+"\n天气信息:"+weather+"\n风力:"+wind+"\n穿衣指数:"+wearinfo);} catch (Exception e) {e.printStackTrace();}