android-pull方式解析xml文件以及XML文件的序列化

android解析XML      ---------------------------基础要像磐石

在android平台上可以使用SAX、DOM和自带的Pull解析器解析xml文件,本文主要介绍使用pull方式解析xml。pull解析器的运行方式和SAX解析器相似,他也有开始元素和结束元素事件,并且可以循环解析。可以使用nextText()方法获取Text类型元素的值。

//如果涉及某些存储操作,需要添加Users权限

下面是将要解析的XML文件,将此xml文件存放在assets目录下。

<?xml version="1.0" encoding="utf-8"?>
<info city='3'>
<name>深圳</name>
<temp>28℃</temp>
<weather>多云</weather>
<msg>天气适宜, 穿个比基尼!</msg>
</info>

创建一个javabean来存放解析出来的数据,创建类WeatherInfo,如下

public class WeatherInfo {
private String name;
private String temp;
private String weather;
private String msg;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "[name=" + name + ", temp=" + temp + ", weather="
+ weather + ", msg=" + msg + "]";
} }

下面开始解析

       //Context上下文,保存当前应用程序,系统资源和配置etc
AssetManager am=this.getAssets(); try {
InputStream is=am.open("weather.xml");
//1,创建xml解析器
XmlPullParser parser=Xml.newPullParser();
//2,初始化解析器,设置要解析的流数据,并设置编码方式
parser.setInput(is,"utf-8");
//3,循环解析
int type=parser.getEventType(); WeatherInfo info=new WeatherInfo();
while(type!=XmlPullParser.END_DOCUMENT){
//如果是开始标签
if(type==XmlPullParser.START_TAG){
if("name".equals(parser.getName())){
String name=parser.nextText();//获取文本数据
info.setName(name);
}else if("temp".equals(parser.getName())){
info.setTemp(parser.nextText());
}else if("weather".equals(parser.getName())){
info.setWeather(parser.nextText());
}else if("msg".equals(parser.getName())){
info.setMsg(parser.nextText());
}
}
//让解析器移动到下一个
type=parser.next();
//关闭流
is.close();
             tv_weather.setText(info.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Pull解析器的工作方式为允许应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以随时跳出。

---------------------------------------------------我是快乐的分割线--------------------------------------------------

序列化就是把对象转换成易于传输的形式。反序列化是在流中重新构建对象 XML序列化只将对象的公共字段和属性值序列化为XML流。

XML序列化不能转换方法、索引器、私有字段或只读属性(只读集合除外)。

XML序列化的核心是 XmlSerializer类

步骤:

1,设置生成xml文件位置

2,创建xml序列化器,并创建输出流

3,写数据。(可以使用循环,这样就不那么蛋疼了)

4,最后,千万不要忘记关闭流!!!千万不要忘记关闭流!!!千万不要忘记关闭流!!!

    //设置生成的xml文件的位置在/data/data/包名/cache目录下
String path = this.getCacheDir().getPath();
File file = new File(path, "info.xml");
//
try {
FileOutputStream fos = new FileOutputStream(file);
// 1,创建XML序列化器
XmlSerializer serializer = Xml.newSerializer();
// 2,初始化序列化器,并设置输出流
serializer.setOutput(fos, "utf-8");// fos 是导出的文件位置 // 3,写数据,下面是一个无聊且蛋疼的过程
serializer.startDocument("utf-8", true);
// 开始标签
// Parameters:
// namespace
// name
serializer.startTag(null, "info");
serializer.startTag(null, "name");
// 设置内容
// Writes text, where special XML chars are escaped automatically
serializer.text("深圳");
serializer.endTag(null, "name"); serializer.startTag(null, "temp");
serializer.text("33℃");
serializer.endTag(null, "temp"); serializer.startTag(null, "weather");
serializer.text("多云");
serializer.endTag(null, "weather"); serializer.startTag(null, "msg");
serializer.text("天气晴朗,出来看大腿啊!!!");
serializer.endTag(null, "msg"); // 结束标签
serializer.endTag(null, "info"); serializer.endDocument(); // 不要忘记关闭流
// 不要忘记关闭流
// 不要忘记关闭流,重要的事情说三遍
fos.close();
Toast.makeText(getApplicationContext(), "成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}

序列化生成的XML文件如下

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<info>
<name>深圳</name>
<temp>33℃</temp>
<weather>多云</weather>
<msg>天气晴朗,出来看大腿啊!!!</msg>
</info>
上一篇:【DEV C++】 Error: ld returned 1 exit status


下一篇:tableview中在tableheaderView上放一个视图,第一次进入视图显示不正常,往下拉视图仍然不正常,往上拉视图正常