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>

 

posted @ 2015-06-26 12:45  MockingBird、  阅读(1482)  评论(2编辑  收藏  举报