xml,sax解析

来源:互联网 发布:短视频软件 编辑:程序博客网 时间:2024/06/07 20:59

     简单描述不同解析方式的优缺点.

     XML是常用的一种存储数据的方式,在Android平台内部很多地方使用了XMl存储,比如轻量级的SharedPreference类的存储,其保存在Data/data[package name]/db.

     android中解析xml有三种,分别是dom,sax,pull,3种解析方式各有所长所短,一般在pc上开发使用dom相对较为轻松些,但对于一些敏感的数库或者手机上还是主要采用sax方式,sax读取是单向的,优点,不占用内存空间,解析属性方便,缺点就是对于嵌套多个分支来说处理不是很方便,而dom方式会把整个xml文件加载到内存中,这里要提醒大家,该方法在查找方面可以喝Xpath很好的结合,如果数据量不是很大推荐使用,而pull在常常使用在J2Me中,对于节点处理比较好,类似sax方式,同样很节省内存,在j2me中经常使用的Kxml库来解析,

     一下说说sax解析和pull解析,android中部推荐使用dom

     sax解析

     SAX是Simple API for XMl的缩写,吧是W3c官方所提出的标准,它是一种轻量型的方法,是比较安全的,android中提供了一种传统的sax使用方法,以及一个便捷的sax包装器,采用基于事件驱动的处理方式,它将xml文档转换成一系列的事件,由单独事件处理器来决定如何处理.

     开始解析,startDocument, 结束解析,endDocument...

     示例演示,首先创建一个简单的服务器,此处通过servlet创建一个返回的Xml的web服务器,sax作为解析的对象.

     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;

     //执行解析

     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.serCOntentHandler(handler);

        //开始解析

        xmlreader.parse(is);

        return handler.personArr;

     }

        // 重写characters(char [] ch , int start , int length)throws SAXException{

                //判断当前标签是否有效

                 if(currentTag != null){

                          //读取标签里面的内容

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

                          //如果是Id标签,则读取 Id标签的内容设置到Person ID上,

                          if("id".equalsIgnoreCase(currentTag)){

                               person.setId(value);

                           }else if("name".equalseIgnoreCase(currentTag)){

                               person.setName(value);

                          }else if("age".equalasIg....)

                          .........

                             person.setAddress(value);

                  }


            }

         //解析xml时,读取到结束一个标签时,

        重写endElement(String uri , String localName, String qName) throws SAXException{

                     //将当前标签设置为空

                    currentTag  =  null;

                    //如果结束标签是person的话,代表一个person对象已经读取完毕,将其添加到list后置空.

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

                             personArr.add(person);

                             person = null;

                     }

          }

         //解析xml时,当开始读取xml文档时

        重写startDocument() throws SAXException{

              super.startDocument();

              personArr = new ArrayList<Person>();

         }

         //解析xml,当读取到一个元素标签开始时,

        重写startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{

              super.startElement(uri,localName,qName,attributes);

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

                      person = new Person();

              }

              currentTag = localName;

        }


}

   此篇不好意思,由于时间关系只写了sax解析,此代码是由本人手写的,若赋值运行报错不好意思哈, 若是初学者希望能够理解characters(char [] ch, int start, int length)方法的重写和维护.

  那么显示到手机上怎么看呢 ?

 接下来就简单不过啦, 不过要仔细看哦...

   -------部分代码省略---------------

     saxActivity extends Activity{

              //所有人员信息

             public static ArrayList<Person> objs  = null ;

             static final String queryString ="http:// ...../servlet"; //路径

             重写OnCreate(Bundler savedInstanceState){

                     ------------获取控件Id代码省略---看自己喜欢什么样的TextView布局了----------

                        StringBuffer sb = new StringBuffer();

                        try{

                                  //调用解析Xml服务

                                  objs = SAXXMlService.getPersonInfos(queryString);

                                  if(objs != nulll  && objs.size() > 0){

                                             //循环组装字符窜

                                              for(Person p :objs){

                                                     sb.append("编号:") + p.getId()+"\n";

                                                     sb.append("姓名") + p.getName() +"\n";

                                                     --------------年龄, ------------地址 -----------


                                               }

                                   }

                                   //这个时候就可以显示到布局的页面上了

                                  如: textview.setText(sb.toString());

                        }catch(Exception e){

                                e.printStackTrace();

                        }

             }

      }

      最后在来补充下吧,sax读取xml文档的方法, 占用内存比较少,但是开发流程相比dom就复杂多了,具体采用哪种方法比较合适,大家可以再开发的工程中来体会她们的差别.

      请大家在给我点时间, 我会尽快把pull解析分享给大家.