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