用SAX来解析XML

前端之家收集整理的这篇文章主要介绍了用SAX来解析XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准。SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强。使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并根据文档的内容产生事件。而事件处理器则是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口,它们分别处理事件源在解析XML文档过程中产生的不同种类的事件。在开发中没有必要直接从这4个接口直接继承,因为org.xml.sax.helper包提供了类DefaultHandler,其继承了这4个接口,在实际开发中直接从DefaultHandler继承并实现相关函数就可以了。

如果定制,则还需要重写这几个方法

1.开始解析

 
 
  1. publicvoidstartDocument()
2.结束解析
  
  
  • publicvoidendDocument()
  • 3.遇到元素
     
     
    1. publicvoidstartElement(StringnamespaceURI,StringlocalName,
    2. StringqName,Attributesatts)
    4.遇到元素
      
      
  • publicvoidendElement(StringnamespaceURI,StringqName)
  • 5.之间
      
      
  • publicvoidcharacters(charch[],intstart,intlength)
  • 实例:

    下面来看一个例子,首先创建一个服务器,此处通过JavaWeb里面的Servlet技术创建了一个返回XML的Web服务器,作为SAX解析的对象。Servlet部分程序属于JavaWeb基础部分,此处不讲解。创建的Web服务器返回的XML数据如图10-45所示。

    图10-45 Web服务器返回XML数据

    Web服务器创建后,就可以在Android客户端开始解析XML了。解析前,先创建与XML属性对应的Bean实体类Person,该类中的属性和XML属性一一对应,也可以再对属性创建get和set方法代码来源EX_10_06:

       public class Person {  
            private String id;  
            private String name;  
            private String age;  
            private String address;  
            //省略get和set方法  
        }  

    正式解析部分代码如下

    …………………………………..省略导包部分代码…………………………………  
        public class SAXXmlService extends DefaultHandler {  
        // //定义一个Person引用  
        Person person = null;  
        // 此处将XML里的数据封装成Person类,personList用于装解析后的数据  
        ArrayList<Person> personArr = null;  
        // 定义一个标记变量,标记当前的XML文件被解析到哪个标签  
        private String currentTag = null;  
     
        /**  
         * 执行解析  
         *   
         * @param queryString  
         * @return  
         * @throws Exception  
         */  
        public static ArrayList<Person> getPersonInfos(String queryString)  
                throws Exception {  
            // 得到SAX解析工厂  
            SAXParserFactory factory = SAXParserFactory.newInstance();  
            // 创建解析器  
            SAXParser parser = factory.newSAXParser();  
            XMLReader xmlreader = parser.getXMLReader();  
            // 得到输入流  
            URL url = new URL(queryString);  
            InputSource is = new InputSource(url.openStream());  
            // 得到SAX解析实现类  
            SAXXmlService handler = new SAXXmlService();  
            xmlreader.setContentHandler(handler);  
            // 开始解析  
            xmlreader.parse(is);  
            return handler.personArr;  
        }  
     
        @Override  
        public void characters(char[] ch,int start,int length)  
                throws SAXException {  
            super.characters(ch,start,length);  
            // 判断当前标签是否有效  
            if (currentTag != null) {  
                // //读取标签里面的内容  
                String value = new String(ch,length);  
                // 如果是Id标签,则读取Id标签内容设置到Person的ID值上  
                if ("id".equalsIgnoreCase(currentTag)) {  
                    person.setId(value);  
                } else if ("name".equalsIgnoreCase(currentTag)) {// name标签  
                    person.setName(value);  
                } else if ("age".equalsIgnoreCase(currentTag)) {// age标签  
                    person.setAge(value);  
                } else if ("address".equalsIgnoreCase(currentTag)) {// address标签  
                    person.setAddress(value);  
                }  
            }  
        }  
     
        /**  
         * 解析XML时,当读到结束一个元素标签时  
         */  
        @Override  
        public void endElement(String uri,String localName,String qName)  
                throws SAXException {  
            super.endElement(uri,localName,qName);  
            // 将当前标签名置空  
            currentTag = null;  
            // 如果当前结束的标签名是person的话,代表一个person对象已经读取完毕。将其添加到list后置空  
            if (localName.equals("person")) {  
                personArr.add(person);  
                person = null;  
            }  
        }  
     
        /**  
         * 解析XML时,当开始读取XML文档时  
         */  
        @Override  
        public void startDocument() throws SAXException {  
            super.startDocument();  
            personArr = new ArrayList<Person>();  
        }  
     
        /**  
         * 解析XML时,当开始读到一个元素标签开始时  
         */  
        @Override  
        public void startElement(String uri,String qName,Attributes attributes) throws SAXException {  
            super.startElement(uri,qName,attributes);  
            if (localName.equals("person")) {  
                person = new Person();  
            }  
            currentTag = localName;  
        }  
     
    }  
    

    猜你在找的XML相关文章