美文网首页
XML数据解析

XML数据解析

作者: TakeItEasyJQ | 来源:发表于2017-08-23 09:29 被阅读0次

    这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了

    XML的解析有Pull和SAX两种方式(SAX要继承DefaultHandler类)

    <apps>
        <app>
            <id>1</id>
            <name>Googlemap</name>
            <version>1.0</veision>
        </app>
    <app>
            <id>2</id>
            <name>Chrome</name>
            <version>2.1</veision>
        </app>
        <app>
            <id>3</id>
            <name>GooglePlay</name>
            <version>2.3</veision>
        </app>
    </apps>
    

    Pull

    privare void parseXMLWithPull(String xmlData){
        try{
            XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser=factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            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:     //<apps>、<app>、<id>等
                        if("id".equals(nodeName)){
                            id=xmlPullParser.nextText();
                        }else if("name".equals(nodeName)){
                            name=xmlPullParser.nextText();
                        }else if("veision".equals(nodeName)){
                            veison=xmlPullParser.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG :       //</apps>、</apps>等
                        if("app".equals(nodeName)){
                            //相应的逻辑
                        }
    //由此可知Pull为一行一行读取后寻找与给定值相同的节点名称,找到后提取值
    //START_TAG与END_TAG间包含的为上例中一个<app></app>,例中 共3个
                    default:
                        break;
              }
            }
        }
    }
    

    SAX

    public class SAXHandler 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{
        //根据当前节点名自动判断添加至哪一StringBuilder中
            if("id".equals(nodeName)){
                id.append(ch ,start ,length);
            }else  if("name".equals(nodeName)){
                id.append(ch ,start ,length);
            }else  if("version".equals(nodeName)){
                id.append(ch ,start ,length);
            }
        }
        @override  
        public void endElement(String uri ,String localName ,String qName) throws
                                                                                          SAXException{
        //某一节点解析完成后调用
            if("app".equals(nodeName)){
                //自己的逻辑。可能有回车或转行符,调用trim()去掉id.toString().trim();
                id.setLength(0) ;name.setLength(0) ;version.setLength(0); //清空
            }
        }
        @override
        public void endDocument() throws SAXException{
            super.endDocument();
        }
    }
    

    使用时

    private void parseXMLWithSAX(String xmlData){
        try{
             SAXParserFactory factory=SAXParserFactory.newInstance();
             XMLReader xmlReader=factory.newSAXParser().getXMLReader();
            SAXHandler handler=new SAXHandler();
            xmlReader.setContentHandler(handler);
            xmlParser.parse(new inputSource(new StringReader(xmlData)));
        }catch(SAXException e){
            e.printStackTrace();
        }
    }
    

    相关文章

      网友评论

          本文标题:XML数据解析

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