xml文档的pull解析与SAX解析

一、Pull解析:

1.在java中的使用方法:                                                        

1)首先InputStream ins = this.getClass().getClassLoader().
     getResourceAsStream("xxx.xml");获取到一个流对象                           

2)获取xml的解析工厂对象XmlPullParserFactory factory = XmlPullParserFactory.newInstance();                                                 

3)通过解析工厂获取xml解析器XmlPullParser parser = factory.newPullParser();   

4)绑定需要解析的xml文件以及设置解编码格式,应该与xml文件的编码格式一致parser.setInput(ins, "UTF-8");                                                 

5)获取解析指针指向的当前标签类型int type = parser.getEventType();             

6)通过指针遍历xml文件while(type != XmlPullParser.END_DOCUMENT)在循环体内执行你需要的操作,别忘了执行完操作移动指针指向下一个标签parser.next()                              

 2.在Android中的使用方法:Android中的解析器构造方式与java不同因为都封装好了                    

XmlPullParser xpp = Xml.newPullParser();其他的与java都一样

Android中的代码示例:

private void parseXMLwithPull(InputStream input) {

    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(input,"UTF-8");
        int type = parser.getEventType();
        String id = "";
        String name = "";
        String version = "";

        while (type != XmlPullParser.END_DOCUMENT) {

            String nodeName = parser.getName();
            switch (type) {

                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.i("zhangdi",id);
                        Log.i("zhangdi",name);
                        Log.i("zhangdi",version);
                    }
                    break;
            }
            type = parser.next();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

二、SAX解析:

1.新建一个SAXHandler类继承DefaultHandler,重写startDocument(开始xml解析的时候调用)、endDocument(结束xml解析的时候调用)、startElement(解析某个节点的时候调用)、endElement(完成解析某个节点的时候调用)以及characters(获取节点内容的时候调用)这5个方法;

2.构建xml解析工厂XMLParserFactory factory = XMLParserFactory.newInstance();

3.通过解析工厂获取XMLReader reader = factory.newSAXParser.getXMLReader();

4.设置reader的解析handler reader.setContentHandler(new SAXHandler());

5.解析数据reader.parse();

Android示例代码:

1.SAXHandler:

public class SAXHandler extends DefaultHandler {

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

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        nodeName = localName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if ("app".equals(localName)) {
            Log.i("zhangdi",id.toString());
            Log.i("zhangdi",name.toString());
            Log.i("zhangdi",version.toString());
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        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);
        }
    }
}

2.具体解析步骤:

private void parseXMLwithSAX(String string) {

    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader reader = factory.newSAXParser().getXMLReader();
        SAXHandler handler = new SAXHandler();
        reader.setContentHandler(handler);
        reader.parse(new InputSource(new StringReader(string)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值