PULL和SAX解析xml文件

最近在学习android方面的知识,今天看到了关于使用PULL和SAX两种不同方式解析xml文件,在这里简单总结一下。

SAX是一种基于“推”的解析方式,它是自动将事件推入注册的事件处理器进行处理,所以你不能控制事件处理的主动结束。在使用SAX方式解释xml文档时,它不会一次将整个的文档读入内存在进行解析,而是在我们读取文档的过程中就对它进行解析,但是SAX在解析xml文档时,还是要遍历完毕文档中的所有节点的。所以当我们需要某一个xml文档中的前边某一部分时,如果我们采用这种方式的话,会十分浪费资源。

PULL是一种基于“拉”的解析方式,应用程序可以根据我们自己的需要来控制解析器的读取。我们可以让应用程序代码主动从解析器中获取事件,这样的话当我们获取到满足我们需要的内容后,就可以结束解析。

下面是关于两种方式解析xml文件的简单例子
1.需要解析的xml文件如下:

<apps>
    <app>
        <id>1</id>
        <name>a</name>
        <version>1.0</version>
    </app>
    <app>
        <id>2</id>
        <name>b</name>
        <version>1.1</version>
    </app>
</apps>

2.使用PULL方式解析xml文件

    //使用pull方式解析xml格式数据
    private void parseXMLWithPull(String xmlData){

        String id = "";
        String name = "";
        String version = "";

        try {
            //创建一个pull解析器
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(new StringReader(xmlData));

            //获取文档的当前位置
            int eventType = parser.getEventType();
            while(eventType != XmlPullParser.END_DOCUMENT){

                //得到属性标记
                String nodeName = parser.getName();
                switch (eventType){

                    //开始解析某个节点
                    case XmlPullParser.START_TAG:
                        if("id".equals(nodeName)){
                            id = parser.nextText();
                        }else if("name".equals(nodeName)){
                            name = parser.nextText();
                        }else if("version".equals(nodeName)){
                            version = parser.nextText();
                        }
                        break;

                    //完成解析某个节点
                    case XmlPullParser.END_TAG:
                        if("app".equals(nodeName)){
                            Log.d("Main2Activity",id);
                            Log.d("Main2Activity", name);
                            Log.d("Main2Activity", version);
                        }
                        break;
                    default:
                        break;
                }
                eventType = parser.next();
            }

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

3.使用SAX方式解析xml文件

public class MyHandler extends DefaultHandler{

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;


    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = 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(nodeName)){
            Log.d("ContentHandler", id.toString());
            Log.d("ContentHandler", name.toString());
            Log.d("ContentHandler", version.toString());
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {

        super.endDocument();
    }
}
    //使用SAX方式解析xml文件
    private void parseXMLWithSax(String xmlData){

        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader xmlReader = null;
        try {
            xmlReader = factory.newSAXParser().getXMLReader();
            MyHandler myHandler = new MyHandler();
            xmlReader.setContentHandler(myHandler);
            xmlReader.parse(new InputSource(new StringReader(xmlData)));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值