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>
温故而知新

浙公网安备 33010602011771号