xml解析之pull解析

XML解析有三种方式,这里简单介绍pull解析

这里简单介绍下解析的机制:其实就是先获取到XmlPullParser对象 我这里是通过XmlPullParserFactory获取的

有了对象之后其实就是根据记录EventType(通过XmlPullParser对象获得)然后逐个扫描XML的所有标签

这里举个例子,假如我们有个最简单的XML <root><body>test</body></root> 那么他就会通过while(eventType != xmlPullParser.END_DOCUMENT){}扫描5次

注意中间的文字也是会扫描一次的,不是只有标签才会扫描。

这里要说下END_DOCUMENT,它指的是最后的标签也就是我们例子里的</root>,那么这个循环就是直到eventype记录到最后一个标签停止。

在这里先上部分代码

 public void initLists(){
        //实例化工厂对象
        XmlPullParserFactory factory = null;
        ConvenienceCheckModel convenienceCheckModel = null;
        List<ConvenienceCheckModel> list = new ArrayList<ConvenienceCheckModel>();
        try {
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xmlPullParser = factory.newPullParser();
            InputStream inputStream = this.getResources().openRawResource(R.raw.convenience_check_contents);
            xmlPullParser.setInput(inputStream,"UTF-8");
            int eventType = xmlPullParser.getEventType();
            //如果不读到end标签就继续循环
            while(eventType != xmlPullParser.END_DOCUMENT){
                String tag = xmlPullParser.getName();
                //如果是start标签
                switch (eventType){
                    case XmlPullParser.START_TAG:
                        if(tag.equals("name")){
                            convenienceCheckModel = new ConvenienceCheckModel();
                            convenienceCheckModel.setName(xmlPullParser.nextText());
                        }else if(tag.equals("number")){
                            convenienceCheckModel.setNumber(xmlPullParser.nextText());
                            list.add(convenienceCheckModel);//2个属性都已经添加,将其加入list
                        }
                        break;
                    //如果是end标签
                    case XmlPullParser.END_TAG:
                        //如果end标签是categories按逻辑加入lists清除子list内容
                        if(tag.equals("categories")){
                            lists.add(list);
                            list = new ArrayList<ConvenienceCheckModel>();
//                            list.clear();
                        }
                        break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
解析的xml是

<root>
    <categories>
        <category>
            <name>民警、匪警</name>
            <number>110</number>
        </category>
        <category>
            <name>急救中心</name>
            <number>120</number>
        </category>
        <category>
            <name>火灾、火警</name>
            <number>119</number>
        </category>
        <category>
            <name>交通事故、交警</name>
            <number>122</number>
        </category>
    </categories>
    <categories>
        <category>
            <name>申通快递</name>
            <number>0574-62820966</number>
        </category>
        <category>
            <name>圆通快递</name>
            <number>0574-62556567</number>
        </category>
        <category>
            <name>中通快递</name>
            <number>0574-62630488</number>
        </category>
        <category>
            <name>顺丰快递</name>
            <number>4008111111</number>
        </category>
    </categories>
</root>
要想解析xml其实无非就是根据逻辑判断你要在哪取数据,标签名是知道位置的途径,可以通过eventType 与xmlPullParser.START_TAG,END_TAG进行初步筛选,

START_TAG代表起始标签,END_TAG表示结束标签,然后像上面代码那样进入其中通过xmlPullParser.getName()这个方法获取标签名进一步判断如果是想要的可以通过

xmlPullParser.nextText()获取下一个位置的文字内容,当然我们都知道想要下1个位置有文字内容,

那这里必须是START_TAG.相信通过上面的代码和部分介绍你已经会使用

pull解析XML了吧。再提一下2个方法,一个是xmlPullParser.Text,代表是文本,也就是标签中放文字的地方。一个是getText(),如果你在START_TAG上使用这个方法的话

是不能获取文字的,因为标签上是没有值的,只能用上面提过的nextText(). 只有在xmlPullParser.Text下面可以用getText()获取到值。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值