Android解析xml数据的一种常用方式——PULL解析器解析

大家都知道Android解析xml数据有常见的三种方式:

第一种方式:DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。

第二种方式:SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。

第三种方式:PULL解析器:
Android并未提供对Java StAX API的支持。但是,Android附带了一个pull解析器,其工作方式类似于StAX。它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。

今天咱们就以PULL解析器为例,其他方式后续会继续相继更新

public void onclick(View view) {
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String url = "http://apis.juhe.cn/idcard/index?   
                    key=69d5592ab41bdc40410e7fe34f9c" +                         
                    "69d4&cardno=330326198903081211&dtype=xml";
                    URL u = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) u.openConnection();
                    conn.setRequestMethod("GET");
                    if (conn.getResponseCode() == 200) {
                        InputStream in = conn.getInputStream();
                        XmlPullParser parser = Xml.newPullParser();
                        parser.setInput(in, "UTF-8");
                        int event = parser.getEventType();
                        while (event != XmlPullParser.END_DOCUMENT) {
                            Log.i("start_document", "start_document");
                            switch (event) {
                                case XmlPullParser.START_DOCUMENT:
                                    break;
                                case XmlPullParser.START_TAG:
           if ("resultcode".equals(parser.getName())) {
                 resultcode = parser.nextText();
                 Message message = new Message();
                 Bundle b = new Bundle();
                 b.putString("resultcode", resultcode);
                 message.setData(b);
             PullXml.this.handler.sendMessage(message);}
          if (("reason").equals(parser.getName())) {
                reason = parser.nextText();
                }
         if ("error_code".equals(parser.getName())) {
               error_code = parser.nextText();
                }
                break;
        case XmlPullParser.END_TAG:
         break;
           }
          event = parser.next();
           }
           }
                } catch (Exception e) {
                    Looper.prepare();
                    Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
                    Looper.loop();
                }
            }
        });
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        textView.setText(resultcode + reason + error_code);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴唐人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值