Xml数据解析—Pull和Sax方式

作者: 见哥哥长高了 | 来源:发表于2019-08-06 18:56 被阅读6次

    我们在此只是举一个简单的xml内容的解析实例,来学习一下在android开发的过程当中,针对xml内容比较常见的两种解析方式。其实也对应于iOS开发中的Dom解析和Sax解析。

    下面是一个xml文本

    <apps>
        <app>
           <id>1</id>
           <name>Google</name>
           <version>1.1</version>
        </app>
        <app>
           <id>2</id>
           <name>Iphone</name>
           <version>2.1</version>
        </app>
        <app>
           <id>3</id>
           <name>Mac</name>
           <version>3.1</version>
        </app>
    </apps>
    
    Pull解析方式

    以下是具体的实现过程,内容很简单,不做过多的解释,相关细节在代码中注释标出。

        public void parserXmlWithpull(){
    
            String domStr ="<apps><app><id>1</id><name>Google</name><version>1.1</version></app><app><id>2</id><name>Iphone</name><version>2.0</version></app><id>3</id><name>Mac</name><version>3.2</version><app></app></apps>";
    
            try {
    
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    
                XmlPullParser xmlPullParser =  factory.newPullParser();
    
                xmlPullParser.setInput(new StringReader(domStr));
    
                int eventType = xmlPullParser.getEventType();
    
                String id = "";
                String name = "";
                String version = "";
    
                while (eventType != XmlPullParser.END_DOCUMENT){
    
                    String nodeName = xmlPullParser.getName();
    
                    switch (eventType){
    
                            //开始解析某个节点的时候
                        case XmlPullParser.START_TAG:
                            {
                                if ("id".equals(nodeName)){
    
                                    id = xmlPullParser.nextText();
    
                                }else if ("name".equals(nodeName)){
    
                                    name = xmlPullParser.nextText();
    
                                }else if ("version".equals(nodeName)){
    
                                    version = xmlPullParser.nextText();
    
                                }
                            }
                            break;
                            //完成解析某个节点
                        case XmlPullParser.END_TAG:
                        {
    
                            if ("app".equals(nodeName)){
    
                                Toast.makeText(MainActivity.this,"name = "+name+" version="+version,Toast.LENGTH_LONG).show();
    
                            }
                        }
                        break;
    
                        default:
    
                            break;
                    }
                    eventType = xmlPullParser.next();
                }
            }catch (Exception e){
    
                e.printStackTrace();
    
            }
        }
    
    Sax解析方式

    Sax解析相对Pull解析稍微复杂了一丁点,主要是多出了几个方法需要实现,但并不难。
    首先,我们需要创建一个类,继承自DefaultHandler,我们在此创建了一个CustomeHandle类,并实现相关方法, 其大致过程也是一目了然。

        public class CustomeHandle extends DefaultHandler{
    
            private String nodeName;
    
            private StringBuilder id;
    
            private StringBuilder name;
    
            private StringBuilder version;
    
    
            /*
            * 开始Xml解析的时候会调用
            * */
            @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);
    
                if ("app".equals(localName)){
    
                    Toast.makeText(MainActivity.this,"id="+id+" name="+name+" version"+version,Toast.LENGTH_LONG).show();
    
                    id.setLength(0);
                    name.setLength(0);
                    version.setLength(0);
                }
    
            }
            /*
            * 结束xml解析的时候调用
            * */
            @Override
            public void endDocument() throws SAXException {
                super.endDocument();
    
            }
        }
    

    以上,我们只是创建了一个类CustomeHandle,但并未实现解析。下面是运用CustomeHandle类实现解析的过程。

        public void parserXmlWithSax() {
    
            String domStr ="<apps><app><id>1</id><name>Google</name><version>1.1</version></app><app><id>2</id><name>Iphone</name><version>2.0</version></app><id>3</id><name>Mac</name><version>3.2</version><app></app></apps>";
    
            try{
    
                SAXParserFactory factory = SAXParserFactory.newInstance();
    
                XMLReader reader = factory.newSAXParser().getXMLReader();
    
                CustomeHandle handle = new CustomeHandle();
    
                //将CustomeHandle到实例设置到XMLReader中
                reader.setContentHandler(handle);
    
                reader.parse(new InputSource(new StringReader(domStr)));
    
            }catch (Exception e){
    
                e.printStackTrace();
    
            }
        }
    

    相关文章

      网友评论

        本文标题:Xml数据解析—Pull和Sax方式

        本文链接:https://www.haomeiwen.com/subject/tgowdctx.html