<?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();
}