天天看点

Android 创建与解析XML(三)—— Sax方式

http://blog.csdn.net/sunboy_2050/article/details/7521598

1. sax概述

sax是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在contenthandler中,下面是其主要方法:

startdocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源

enddocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中做些善后工作,如:释放申请的对象资源

startelement(string namespaceuri, string localname, string qname, attributes atts):当遇开始标签的时候就会触发这个方法。

endelement(string uri, string localname, string name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。

charachers(char [] ch, int start, int length):当遇到xml内容时触发这个方法,用new string(ch,start,length)可以接受内容。 

sax方式创建xml,应用了标准xml构造器 javax.xml.transform.sax.transformerhandler 事件来创建 xml 文档,需要导入以下内容

javax.xml.transform

javax.xml.transform.sax.saxtransformerfactory; javax.xml.transform.sax.transformerhandler; javax.xml.transform.transformer; javax.xml.transform.transformerconfigurationexception; javax.xml.transform.transformerfactoryconfigurationerror; javax.xml.transform.outputkeys; javax.xml.transform.stream.streamresult;

javax.xml.parsers

javax.xml.parsers.saxparser; javax.xml.parsers.saxparserfactory; javax.xml.parsers.factoryconfigurationerror; javax.xml.parsers.parserconfigurationexception;

org.xml.sax

org.xml.sax.attributes; org.xml.sax.saxexception; org.xml.sax.helpers.attributesimpl; org.xml.sax.helpers.defaulthandler;

sdk源码查看路径(google code)

sax 创建和解析 xml 的效果图:

Android 创建与解析XML(三)—— Sax方式

2、sax 创建 xml

首先,saxtransformerfactory.newinstance() 创建一个工厂实例 factory

接着,factory.newtransformerhandler() 获取 transformerhandler 的 handler 对象

然后,通过 handler 事件创建handler.gettransformer()、 handler.setresult(result),以及 startdocument()、startelement、characters、endelement、enddocument()等

code

[java] view

plaincopyprint?

/** sax方式,创建 xml  */  

public string saxcreatexml(){  

    stringwriter xmlwriter = new stringwriter();  

    person []persons = new person[3];       // 创建节点person对象  

    persons[0] = new person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");  

    persons[1] = new person(2, "baidu", "http://www.baidu.com");  

    persons[2] = new person(3, "google", "http://www.google.com");  

    try {  

        saxtransformerfactory factory = (saxtransformerfactory)saxtransformerfactory.newinstance();  

        transformerhandler handler = factory.newtransformerhandler();  

        transformer transformer = handler.gettransformer();     // 设置xml属性  

        transformer.setoutputproperty(outputkeys.indent, "yes");  

        transformer.setoutputproperty(outputkeys.encoding, "utf-8");  

        transformer.setoutputproperty(outputkeys.version, "1.0");  

        streamresult result = new streamresult(xmlwriter);      // 保存创建的xml  

        handler.setresult(result);  

        handler.startdocument();  

        attributesimpl attr = new attributesimpl();  

        attr.clear();  

        attr.addattribute("", "", "author", "", "homer");  

        attr.addattribute("", "", "date", "", "2012-04-27");  

        handler.startelement("", "", "root", attr);  

        int personslen = persons.length;  

        for(int i=0; i<personslen; i++){  

            attr.clear();  

            handler.startelement("", "", "person", attr);  

            handler.startelement("", "", "id", attr);  

            string id = persons[i].getid() + "";  

            handler.characters(id.tochararray(), 0, id.length());  

            handler.endelement("", "", "id");  

            handler.startelement("", "", "name", attr);  

            string name = persons[i].getname();  

            handler.characters(name.tochararray(), 0, name.length());  

            handler.endelement("", "", "name");  

            handler.startelement("", "", "blog", attr);  

            string blog = persons[i].getblog();  

            handler.characters(blog.tochararray(), 0, blog.length());  

            handler.endelement("", "", "blog");  

            handler.endelement("", "", "person");  

        }  

        handler.endelement("", "", "root");  

        handler.enddocument();  

    } catch (transformerfactoryconfigurationerror e) {      // saxtransformerfactory.newinstance  

        e.printstacktrace();  

    } catch (transformerconfigurationexception e) {         // factory.newtransformerhandler  

    } catch (illegalargumentexception e) {      // transformer.setoutputproperty  

    } catch (saxexception e) {      // handler.startdocument  

    } catch (exception e) {  

    }  

    savedxml(filename, xmlwriter.tostring());  

    return xmlwriter.tostring();  

}  

运行结果:

Android 创建与解析XML(三)—— Sax方式

3、sax解析xml

    /** sax方式,解析 xml  */  

    public string saxresolvexml(){  

        stringwriter xmlwriter = new stringwriter();  

        inputstream is = readxml(filename);  

        try {  

            saxparserfactory factory = saxparserfactory.newinstance();  

            saxparser saxparser = factory.newsaxparser();  

            personhandler handler = new personhandler();    // person处理handler  

            saxparser.parse(is, handler);                   // handler解析xml  

            // 获取解析的xml  

            string xmlheader = handler.getxmlheader();  

            xmlwriter.append(xmlheader);  

            list<person> personslist = handler.getpersons();  

            int personslen = personslist.size();  

            for(int i=0; i<personslen; i++){  

                xmlwriter.append(personslist.get(i).tostring()).append("\n");  

            }  

        } catch (factoryconfigurationerror e) {         // saxparserfactory.newinstance  

            e.printstacktrace();  

        } catch (parserconfigurationexception e) {      // factory.newsaxparser  

        } catch (saxexception e) {          // factory.newsaxparser  

        } catch (illegalargumentexception e) {      // saxparser.parse  

        } catch (ioexception e) {           // saxparser.parse  

        } catch (exception e) {  

        return xmlwriter.tostring();  

    /** handler处理类 */  

    private final class personhandler extends defaulthandler{  

        private list<person> personslist = null;  // 保存person  

        private person person = null;  

        private stringbuffer xmlheader;             // 保存xml头部信息  

        private string tag = null;          // xml element  

        /** 返回解析的xml头部信息 */  

        public string getxmlheader(){  

            return xmlheader.tostring();  

        /** 返回解析的person实例数组 */  

        public list<person> getpersons(){  

            return personslist;  

        @override  

        public void startdocument() throws saxexception{  

            super.startdocument();  

            personslist = new arraylist<person>();  

            xmlheader = new stringbuffer();  

        public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception{  

            super.startelement(uri, localname, qname, attributes);  

            if("root".equals(localname)) {  

                string attrauthor = attributes.getvalue(0);  

                string attrdate = attributes.getvalue(1);  

                xmlheader.append("root").append("\t\t");  

                xmlheader.append(attrauthor).append("\t");  

                xmlheader.append(attrdate).append("\n");  

            } else if("person".equals(localname)) {  

                person = new person();  

            }   

            tag = localname;  

        public void characters(char[] ch, int start, int length) throws saxexception {  

            super.characters(ch, start, length);  

            if (null != tag) {  

                string value = new string(ch, start, length);  

                system.out.println("value = " + value);  

                if ("id".equals(tag)) {  

                    person.setid(new integer(value));  

                } else if ("name".equals(tag)) {  

                    person.setname(value);  

                } else if ("blog".equals(tag)) {  

                    person.setblog(value);  

                }  

        public void endelement(string uri, string localname, string qname) throws saxexception {  

            if("person".equals(qname)) {  

                personslist.add(person);  

                person = null;  

            tag = null;  

            super.endelement(uri, localname, qname);  

        public void enddocument() throws saxexception{  

//          personslist = null;  

            super.enddocument();  

Android 创建与解析XML(三)—— Sax方式

继续阅读