Android day_4 (Xml的生成和解析)

1.Xml的两种生成方式:

第一种:

使用StringBuffer sb=new StringBuffer();
//创建sb  对象
        StringBuffer sb=new StringBuffer();
        //组拼xml的文件头
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        //组拼xms根节点
        sb.append("<smss>");
        //组拼sms节点
        for (Sms sms:smslist){
            sb.append("<sms>");
            sb.append("<address>");
            sb.append(sms.getAddress());
            sb.append("</address>");

            sb.append("<bodyu>");
            sb.append(sms.getBodyu());
            sb.append("</bodyu>");

            sb.append("<date>");
            sb.append(sms.getDate());
            sb.append("</date>");
            sb.append("</sms>");
        }
        sb.append("</smss>");
        try {
            File file=new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml");
            FileOutputStream fos=new FileOutputStream(file);
            fos.write(sb.toString().getBytes());
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

第二种:

使用XmlSerializer
 try {
            //[1]获取 XmlSerializer 类的实例,通过工具类Xml的 Xml.newSerializer()方法
            XmlSerializer serializer= Xml.newSerializer();
            //[2]设置XmlSerializer的序列化参数。
            File file=new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup22.xml" );
            FileOutputStream fos=new FileOutputStream(file);
            //指定fos流的编码方式
            serializer.setOutput(fos,"utf-8");
            //[3]开始写Xml文件的开头  第一个参数为文件的编码方式第二个参数是否为独立文件(没有其他约束)
            serializer.startDocument("utf-8",true);
            //写xml的根节点  第一个参数为命名空间  不需要写null,第二个节点名称
            serializer.startTag(null,"smss");
            for(Sms sms:smslist){
                serializer.startTag(null,"sms");

                serializer.startTag(null,"address");
                serializer.text(sms.getAddress());
                serializer.endTag(null,"address");

                serializer.startTag(null,"bodyu");
                serializer.text(sms.getBodyu());
                serializer.endTag(null,"bodyu");

                serializer.startTag(null,"date");
                serializer.text(sms.getDate());
                serializer.endTag(null,"date");

                serializer.endTag(null,"sms");
            }
            serializer.endTag(null,"smss");
            //写文件结尾
            serializer.endDocument();
            fos.close();
        } catch (IOException e) {

            e.printStackTrace();
        }

2.Xml的解析


第一步:编写解析Xml的业务方法

 //服务器以流的形式返回数据所以 传入参数为一个流
    public static List<Sms> parserXml(InputStream in) throws Exception{
        //[0]声明集合对象
        List<Sms> weatherlists=null;
        Sms sms=null;
        //[1]获取XmlPullParser  解析实例 通过工具类Xml的Xml.newPullParser()方法
        XmlPullParser parser= Xml.newPullParser();
        //[2]设置XmlPullParser 的参数  第一个为一个流  第二个为编码方式
        parser.setInput(in,"utf-8");
        //[3]获取事件类型  不等于结尾继续向下解析
        int type=parser.getEventType();
        while (type!=XmlPullParser.END_DOCUMENT){
            switch (type){
                case XmlPullParser.START_TAG://解析开始标签
                    //具体判断  是哪个开始标签
                    if("smss".equals(parser.getName())){
                        weatherlists=new ArrayList<Sms>();
                    }else if("sms".equals(parser.getName())){
                        //取出这个标签的属性  0代表取第一个
                        //parser.getAttributeValue(0);
                        sms=new Sms();
                    }else if("address".equals(parser.getName())){
                        //取出两个标签中的数据
                        String adderss=parser.nextText();
                        sms.setAddress(adderss);
                    }else if("bodyu".equals(parser.getName())){
                        String bodyu=parser.nextText();
                        sms.setBodyu(bodyu);
                    }else if("date".equals(parser.getName())){
                        String date=parser.nextText();
                        sms.setDate(date);
                    }
                    break;
                case XmlPullParser.END_TAG://解析结束标签
                    if("sms".equals(parser.getName())){
                        //把数据  存入集合
                        weatherlists.add(sms);
                    }
                    break;
            }
            //不停向下解析 直到结束
            type=parser.next();
        }
        return weatherlists;
    }

第二步:在MainActivity中调用  已经编写好的业务方法

 //[1]显示Xml信息
        TextView tv_weather=findViewById(R.id.tv_weather);
        //[1.2] 获取资产的管理者  通过上下文
        try {
            InputStream is=getAssets().open("weather.xml");
            //调用定义好的  业务方法
            List<Sms> list=Weatherparser.parserXml(is);
            StringBuffer sb=new StringBuffer();
            for (Sms sms:list){
                sb.append(sms.toString());
            }
            //把数据显示在 TextView 上
            tv_weather.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

猜你喜欢

转载自blog.csdn.net/depths_t/article/details/81164169