解析xml文件

来源:互联网 发布:嘉兴南湖行知小学 编辑:程序博客网 时间:2024/05/29 15:43
 

<?xml version="1" encord="utf-8"?>  

    <out:persons>                       

        <person id="9">          

            <name>CongHua</name>   

            <age>20</age>          

        </person>    

    <persons>          

采用SAX解析xml文件:

    startDcoument()方法:遇到文档开头时,调用这个方法,可以在其中做一些预处理工作。

    endDcoument()方法:与上面相应,在文档结束时调用,可以做一些善后工作。

    startElement(String namespaceURL, String localName, String qName, Attributes atts):

        namespaceURL是命名空间,localName是不带命名空间,qName是标签名,atts是标签属性。

    endElement(String namespaceURL, String localName, String name):namespaceURL是命名

        空间,localName是不带命名空间名,name是标签名。

    character(char[] ch, int start, int length):ch是整个xml文本,start文本开始位置,length是文本长度

     解析条件:

        <?xml version="1" encord="utf-8"?>  //  触发startDocument()

        <out:persons>                 //触发startElement("out","persons",null,"{Attributes}")

        <name>CongHua</name>  //触发character(" <name>...</name>,"50","7")

        </person>    //触发endElement(null,"person",n)      

     例子:

        public    List<Person>    getSAXPerson(InputStream    id)    throws    Exception{

            SAXParserFactory    factory    =    SAXParserFactory.newInstance() ;

            SAXParser    parser    =    factory.newSAXParser() ;

            PersonHandler    handler    =    new    PersonHandler() ;

            parser.parse(is,handler) ;

        }

        class    PersonHandler    extends    DefaultHandler{

            private    List<Person>    persons    =    null    ;

            private    String    tag     =    null    ;

            private    Person    person    =    null    ;

            public    void    startDocument()    throws    SAXParserException{

                persons    =    new    ArrayList<Person>()    ;  

            }

            public    void    startElement(String namespaceURL, String localName, String qName,

                     Attributes atts)    throws    SAXParserException{

                if("peraon".equal(localName)){

                    person = new Person()    ;

                    person.setId(new    Integer(attribute.getValue(0)))    ;         

                }

                tag    =    localName    ;

            }

            public    void    character(char[] ch, int start, int length)    throws    SAXParseException{

                if(tag!=null){

                    String    data    =    new    String(ch,start,length)    ;

                    if("name".equal(tag)){

                        person.setName(data)    ;

                    }else    if("age".equal(tag)){

                        person.setAge(new    Short(data))    ;

                    }

                }

            }

            public    void    endElement()    throws    SAXParseException{

                if("person".equal(localName)){

                    persons.add(person)    ;

                    person    =    null    ;

                }

            }

        }           

     

使用DOM解析xml文件:

    将xml内容以文档树存放在内存,使用DOM解析,代码直观,编码简单,但消耗内存较大,对于android    移动设备等内存小,不建议使用DOM解析。

    例子:

        public    static    List<Person>   getPersons(InputStream is)    throws    Exception{

            List<Person>    persons    =    new ArrayList<Person>() ;

            DocumentBuilderFactory    factory    =    DocumentBuilderFactory.newInstance() ;

            DocumentBuilder builder    =    factory.newDocumentBuilder() ;

            Document document    =    builder.parse(is) ;                //已经解析完xml文件,存放到内存文档树

            Element root    =    doucment.getDocumentElement() ;

            NodeList personsNodes    =    root.getElementByTagName("person") ;

            for(int    i=0;   i<personsNode.length();    i++){

                Element    personElement    =    (Element)personNodes.item(i);

                int    id    =    new    Integer(personElement.getAttribute("id")) ;

                Person    person    =    new    Person() ;

                person.setId(id) ;

                NodeList    childNodesList    =    personElement.getChildNodes() ;

                for(int    y=0;    y<childNodeList.length();    y++){

                    if(childNodes.item(y).getNodeType()==Node.ELEMENT_MODE){

                        if("name".equal(childNodes.item(y).getNodeName())){

                            String name = childNodes.item(y).getFirstChild().getNodeValue() ;

                            person.setName(name) ;

                        }else ("age".equal(childNodes.item(y).getNodeName())){

                            String age= childNodes.item(y).getFirstChild().getNodeValue() ;

                            person.setName(new    Short(age)) ;

                        }

                     }   

                 }

                 persons.add(person) ;

            } 

            is.close() ;

            return    persons ;

        }

 

使用Pull解析xml文件:

    Android内置的Pull解析器,不需要添加额外jar包,android系统本身内部也使用Pull解析xml文件。推荐使用。

    例子:

        public    static    List<Person>    getPullPersons(IntputStream    is)    throws    Exception    {

            List<Person>    persons    =    null    ;

            Person    person    =    null    ;

            XmlPullParser    pullParser    =    Xml.newPullParser()    ;

            pullParser.setInput(is,"UTF-8")    ;

            int    event    =    pullParser.getEventType()    ;

            while(event!=XmlPullParser.END_DOCUMENT){

                switch(event){

                    case    XmlPullParser.START_DOCUMENT    :

                        persons    =    new    ArrayList<Person>()    ;

                        break    ;

                    case    XmlPullParser.START_TAG    :

                        if("person".equal(pullParser.getName())){

                            int    id    =    new    Integer(pullParser.getAttributeValue(0))    ;

                            person    =    new    Person()    ;

                            person.setId(id)    ;

                        }

                        if(person!=null){

                            if("name".equal(pullParser.getName())){

                                person.setName(pullParser.nextText())    ;

                            }else    if("age".equal(pullParser.getName())){

                                person.setAge(new    Short(age))    ;

                            }

                        }

                        break    ;

                    case    XmlParser.END_TAG    :

                        if("person".equal(pullParser.getName())){

                            persons.add(person)    ;

                            person    =    null    ;

                        }

                }

            }

        }