Android基础-----解析xml格式数据

网络传输数据时最常用的格式有XML和json。首先我们获取XML格式数据时,需要搭建一个服务器,服务器搭建详情请看

https://mp.csdn.net/postedit/88534680

xml有两种解析方式:Pull和SAX

Pull解析方式:


    private void sendRequestWithOkHttp(){
        //开启线程发起网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //创建OkHttpClient对象
                    OkHttpClient client=new OkHttpClient();
                    Request request= new Request.Builder()
                            .url("http://l0.0.2.2/get_data.xml")
                            .build();
                    //得到response对象
                    Response response=client.newCall(request).execute();
                    //得到返回的内容
                    String responseData=response.body().string();
                    parseXMLWithPull(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseXMLWithPull(String xmlData) {
        try {
            XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser=factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType=xmlPullParser.getEventType();
            String id="";
            String name="";
            String version="";
            while (eventType!=XmlPullParser.END_DOCUMENT){
                String nodeName=xmlPullParser.getName();
                switch (eventType){
                    //开始解析某个节点
                    case XmlPullParser.START_TAG:{
                        if ("id".equals(nodeName)){
                            id=xmlPullParser.nextText();
                        }else if("name".equals(nodeName)){
                            name=xmlPullParser.nextText();
                        }else if ("version".equals(nodeName)){
                            version=xmlPullParser.nextText();
                        }
                        break;
                    }
                    //完成解析某个节点
                    case XmlPullParser.END_TAG:{
                        if ("app".equals(nodeName)){
                            Log.d("MainActivity","id is"+id);
                            Log.d("MainActivity","name is"+name);
                            Log.d("MainActivity","version is"+version);
                        }
                        break;
                    }
                    default:
                        break;
                }
                eventType=xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

SAX解析方式:

   /**
     * SAX方式解析:需要新建类继承自DefaultHandler类,并重写5个方法,如下所示
     */
    public class ContentHandler extends DefaultHandler{

        private String nodeName;

        private StringBuilder id;

        private StringBuilder name;

        private StringBuilder version;

        private StringBuilder text;

        //在开始XML解析的时候调用
        @Override
        public void startDocument() throws SAXException {
            id = new StringBuilder();
            name = new StringBuilder();
            version = new StringBuilder();
            text = new StringBuilder();
        }

        //在解析某个节点的时候调用
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            nodeName = localName;
        }

        //在获取节点内容时调用
        //注意:获取内容时,该方法可能会被调用多次,同时换行符也会被当作内容解析出来
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if ("id".equals(nodeName)){
                id.append(ch, start, length);
            }else if ("name".equals(nodeName)){
                name.append(ch, start, length);
            }else if ("version".equals(nodeName)){
                version.append(ch, start, length);
            }
        }

        //在对某个节点的解析完成时调用
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if ("app".equals(localName)){
                text.append("id is " + id.toString() + "\n");
                text.append("name" + name.toString() + "\n");
                text.append("version is " + version.toString() + "\n");
                id.setLength(0);
                name.setLength(0);
                version.setLength(0);
            }
        }

        //整个XML解析完成的时候调用
        @Override
        public void endDocument() throws SAXException {
            dataText.setText(text);
            super.endDocument();

        }
    }

    private void xml_sax(){
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            ContentHandler mHandler = new ContentHandler();
            InputStream in = getAssets().open("example.xml");
            parser.parse(in,mHandler);

        } catch (Exception e) {
            e.printStackTrace();

        }
}

总结:

 优点缺点
SAX
  1. 采用事件驱动模式,解析速度快,占用内存少
  2. 非常适合在Android移动设备中使用

缺点

  1. 编码比较麻烦。
  2. 很难同时访问XML文件中的多处不同数据。
Pull
  1. PULL解析器小巧轻便,解析速度快,简单易用
  2. 灵活性高,自由控制访问时机
  3. 非常适合在Android移动设备中使用,Android系统内部在解析、各种XML时也是用PULL解析器。
可扩展性差,无法修改XML树内容结构

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值