XML解析之Pull、Sax方式

本文深入探讨了两种常见的XML解析技术:Pull和SAX。详细介绍了使用Pull解析器逐元素解析XML文档的方法,并通过示例代码展示了如何提取特定节点的数据。同时,文章还讲解了SAX解析器的工作原理,包括如何通过定义ContentHandler来处理解析过程中的开始和结束事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

- pull

    private String parseXMLwithPull(String xml) {
        StringBuffer buffer = new StringBuffer();
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlpull = factory.newPullParser();
            xmlpull.setInput(new StringReader(xml));//开始解析
            int eventType = xmlpull.getEventType();//得到解析事件
            String id = "";
            String name = "";
            String version = "";
            while (eventType != XmlPullParser.END_DOCUMENT){
                String nodeName = xmlpull.getName();
                switch (eventType) {
                    // 开始解析某个结点
                    case XmlPullParser.START_TAG: {
                        if ("id".equals(nodeName)) {
                            id = xmlpull.nextText();
                        } else if ("name".equals(nodeName)) {
                            name = xmlpull.nextText();
                        } else if ("version".equals(nodeName)) {
                            version = xmlpull.nextText();
                        }
                        break;
                    }
                    // 完成解析某个结点
                    case XmlPullParser.END_TAG: {
                        if ("app".equals(nodeName)) {
                            buffer.append("id:" + id + "," + "name:" + name + "," + "version:" + version + ";");
                        }
                        break;
                    }
                    default:
                        break;

                }
                eventType = xmlpull.next();

            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return buffer.toString();
    }

- sax

sax主体部分
private String parseXMLwithSax(String xml) {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        ContentHandler handler = null;
        try {
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
             handler = new ContentHandler();
            // 将ContentHandler的实例设置到XMLReader中
            xmlReader.setContentHandler(handler);
            // 开始执行解析
            xmlReader.parse(new InputSource(new StringReader(xml)));
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return handler.getBufferToString();
    }
ContentHandler
import android.util.Log;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ContentHandler extends DefaultHandler {

    private String nodeName;

    private StringBuilder id;

    private StringBuilder name;

    private StringBuilder version;

    //getter方法得到的对象必须是实例化的对象,不能仅仅是声明,要不然娶不到值
    private StringBuffer buffer = new StringBuffer();

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

    @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 characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        // 根据当前的结点名判断将内容添加到哪一个StringBuilder对象中
        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 {
        super.endElement(uri, localName, qName);
        //buffer = new StringBuffer();//一开始在方法内局部初始化的,结果越过方法再调用getter就得不到值了
        if ("app".equals(localName)) {
            buffer.append("id:" + id.toString().trim() + ","
                    + "name:" + name.toString().trim() + ","
                    + "version:" + version.toString().trim() + ";");

            // 最后要将StringBuilder清空掉
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
            Log.d("contenthandler",buffer.toString());
        }
    }

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

    }

    public String getBufferToString() {
        return buffer.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值