Android开发之XML文件解析

本文详细介绍了在Android开发中如何使用SAX解析XML文件,包括SAX的处理机制、解析器的主要API、事件处理器方法以及一个完整的解析XML的示例代码。解析XML时,SAX会按顺序调用startDocument、startElement、characters等方法,最后调用endDocument。通过实现DefaultHandler并覆盖特定方法,可以处理XML文档内容。
摘要由CSDN通过智能技术生成

      xml文件得到了越来越多的应用,我们可以用它来存储程序的配置数据,也可以在网络上以xml文件传递数据集。所以我们需要学习在Android程序中解析xml文件的方法。由于Android的开发环境是Java,所以Android程序中解析xml文件的方法和Java中解析xml文件的方法是一样的。

1、 SAX 编程技术及SAX的处理机制
      SAX是Simple API for XML的缩写,其处理机制是建立在流和事件的基础之上,即将XML看作是“流(stream) ”,SAX“读取器”在遇到XML的“构件”(如Element,Text等)时,会产生相应的事件,然后再利用注册在“解析器”上的事件处理器时进行事件处理。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parse()方法来开始解析XML文档并根据文档内容产生事件。而事件处理器则是org.xml.sax包中的ContentHandler,DTDHandler,ErrorHandler,以及EntityResolver这四个接口。它们分别处理事件源在解析过程中产生的不同种类的事件(其中DTDHandler是为解析文档DTD时而用)。而事件源XMLReader和这四个事件处理器的连接是通过在XMLReader中的相应的事件处理器注册方法set***()来完成的。

      xml框架结构图

                         

      SAX解析并不透明的进行存储及创建任何数据结构,而此类工作完全交给用户实现的事件处理器。

2、 解析器及主要的SAX API说明 
      (1)SAXParserFactory:

          其为SAXParser对象的工厂对象,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。

          获取该类实例的方法:SAXParserFactory.newInstance()

      (2)SAXParser(解析器)

          利用其包装的XMLReader(包装器)解析来自文件、输入流、URL中的XML,并把解析事件报告给提定的处理器。

         * 获取XMLReader方法:

          XMLReader reader=SAXParserFactory.newInstance().newSAXParser().getXMLReader();

          reader.parse(InputSource input);

     (3)DefaultHandler

         为了实现ContentHandler接口,不得不把ContentHandler中所有的抽象方法都实现,这样比较麻烦。SAX API已经考虑到这个问题,在它的org.xml.sax.helper包中为我们提供了一个方便实现各种处理器接口的帮助类DefaultHandler。其实现了四个核心 SAX2 处理程器接口中的所有回调(适配器模式),该类需要开发者自行继承,并实现“感兴趣”的方法。

  四个核心的SAX2处理器接口为:

  EntityResolver

  DTDHandler

  ContentHandler[H21] (构件)

  ErrorHandler

3、 事件处理器中的各个方法定义及功能 
       void startDocument():在文档开始处的事件处理方法(回调方法)

       void endDocument():在文档结束的事件处理方法

       void startElement(String uri,String lname,String qname,Attributs attrs(属性处理)):在元素开始处的事件处理方法

       void endElement(String uri,String lname,String qname):在元素结束处的事件处理方法

       uri:名字空间的URI(如果支持名字空间)

       lname:返回元素的限定名,<bean>返回bean,而<util:list>返回list(如果支持名字空间)

       qname:带前缀元素名(如果支持名字空间),如<util:list>将返回util:list

       attrs:返回该元素全部属性对象

       characters(char[] data,int index,int length):当遇到字符数据时的事件处理方法。

       data:为XML字符串构成的数组(每次根据缓冲区大小进行传递向后滚动)

       index:当前字符串中第一个字符在data中的位置

       length:当前字符串长度

4、 SAX 编程方法
      4.1、 工作原理:
      <bookCase>

                <book id="1">

                        <title>spring in action(中文版)</title>

               </book>

        </bookCase>

       当一个SAXParser遇到以上的XML时,依次会调用:startDocument,startElement,startElement,startElement,characters(如内容很长可能会有若干次),endElement, endElement, endElement,endDocument。

      4.2、 实现步骤:
        (1)实现继承自DefalutHandler适配器的实现类,覆写“感兴趣”的方法。

        (2)获得SAXParserFactory实例。

        (3)由SAXParserFactory获得XMLReader实例。

        (4)注册处理文档内容解析事件的ContentHandler

        (5)调用XMLReader实例的parser方法,此时需给出“XML源”

示例:新建一个Android应用程序,在main.xml中添加一个按钮,当我们点击这个按钮时将会从本地tomcat服务器上下载一个xml文件,将xml文件的内容保存在String对象中。然后用SAX解析这个String对象。

需要说明的是xml源文件中各标签之间如果要有空格、Tap键等格式字符,因为SAX会把空格、Tab键解析成一个空白节点。这样的话可能会使程序不能输出我们想要显示的内容。在ContentHandler中重写处理空格的方法可以解决这个问题。这里为了简单起见,不再重写处理空格等字符的方法。

下载的xml文件:

       

源代码:

main.xml

     

Android_xml.java

     

MyContentHandler.java

     

HttpDownloader.java

     

FileUtil.java

     

AndroidManifest.xml

     

运行结果:

界面:

     

点击“解析XML文件”按钮打印以下内容:

     

     

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值