XML解析 PULL

XML解析

SAX:

基于事件驱动,顺序读取,占用内存小,不能任意访问指定节点(不灵活),速度快
适用于对内存要求高的设备使用


DOM:

基于树型结构存储,一次性把文档读入内存,占用内存较大,可以任意访问节点(灵活)
适用于在服务器端开发使用
基于DOM的实现还有:
JDOM(API使用集合)
DOM4J(整体性能较好,Hibernate就是使用Dom4j实现配置文件的解析)


PULL解析:

PULL解析的机制与SAX解析相似,都是基于事件驱动
不同的是:
SAX使用一个ContentHandler(内容处理器)来处理数据,解析器读取到相应的内容以回调
ContentHandler的相应方法的方式来处理。
而PULL是使用事件类型常量的标记的方式来处理数据。


使用PULL的步骤:

<1>创建一个PULL解析器对象:

XmlPullParser xmlPullParser = Xml.newPullParser();


<2>设置要解析的数据源

InputStream in = getResources().openRawResource(R.raw.person);
xmlPullParser.setInput(in,"utf-8");


<3>获取事件类型

int eventType = xmlPullParser.getEventType();


<4>通过循环来处理不同的事件类型,结束条件为解析到文档的末尾

while(eventType!=XmlPullParser.END_DOCUMENT){
    //.....
    eventType = xmlPullParser.next();
}


示例:


    private ArrayList<Person>  parseXML() {
//        InputStream in = Xml.parse();  sax解析
        InputStream in = getResources().openRawResource(R.raw.person);
        //创建PULL解析器对象
        XmlPullParser xmlPullParser = Xml.newPullParser();
        ArrayList<Person> persons = new ArrayList();
        Person p = null;
        try {
            //设置要解析的数据源
            xmlPullParser.setInput(in,"utf-8");
            int eventType = xmlPullParser.getEventType();
            while(eventType!=XmlPullParser.END_DOCUMENT){
                try {
                    switch (eventType){
                        case XmlPullParser.START_TAG:
                            String tag = xmlPullParser.getName();
                            p = getPerson(xmlPullParser, p, tag);
                            break;
                        case XmlPullParser.END_TAG:
                            if("person".equals(xmlPullParser.getName())){
                                persons.add(p);
                            }
                            break;
                    }
                    eventType = xmlPullParser.next();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

        return persons;
    }

    private Person getPerson(XmlPullParser xmlPullParser, Person p, String tag) throws XmlPullParserException, IOException {
        if("person".equals(tag)){
            p = new Person();
            p.setPersonid(xmlPullParser.getAttributeValue(xmlPullParser.getNamespace(),"personid"));
        }else if("name".equals(tag)){
            p.setName(xmlPullParser.nextText());
        } else if("age".equals(tag)){
            p.setAge(Integer.parseInt(xmlPullParser.nextText()));
        } else if("sex".equals(tag)){
            p.setSex(xmlPullParser.nextText());
        } else if("tel".equals(tag)){
            p.setTel(xmlPullParser.nextText());
        }
        return p;
    }



使用PULL解析天气数据
http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather?theCityCode=北京
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值