XML文件解析(SAX)

DOM:
   解析时,先将节点全部装载到内存里,解析成一棵树,再进行添加节点、删除节点、取出节点内容等操作;
   优点:这样操作起来比较方便;
   缺点:解析的XML文档比较大时,比较费时;
SAX:
   扫描一行,解析一行;
   优点:解析文档的任意时刻停止解析;
   缺点:操作起来复杂、添加或删除内容比较困难;


1、什么是SAX


   SAX,全称Simple API for XML, 既是指一种接口,也是指一个软件包。
   作为接口,SAX是事件驱动型XML解析的一个标准接口。


2、SAX基本原理
   
   SAX的工作原理简单的说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档结束等地方时,
   通知事件处理函数,由事件处理函数做相应动作,然后继续同样地扫描,直至文档结束。


   大多数SAX实现都会产生以下类型的事件:
   1、在文档的开始和结束时触发文档处理事件;
   2、在文档内每一XML元素接受解析的前后触发元素事件;
   3、任何元数据通常都由单独的事件交付;
   4、在处理文档的DTD或Schema时产生DTD或Schema事件;
   5、产生错误事件时来通知主机应用程序解析错误;


3、SAX常用接口


   ContentHandler接口


   ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。
   该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,
   比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。
   当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。


   ContentHandler接口的方法有以下几种:
   void startDocument()
   void endDocument()
   void startElement(String uri, String localName, String qName, Attributes atts)
   void endElement(String uri, String localName, String qName)
   void characters(char[] ch, int start, int length)


4、SAX解析


   解析文档的过程:


   例子:
      <doc>
            <para>Hello,world!</para>
      </doc>
   例子的解析过程(每次产生一个事件都会触发相应的函数):
      start document
      start element:doc
      start element:para
      characters:Hello,world!
      end element:para
      end element:doc
      end document


   在解析文档的过程中会产生如下一系列事件:
   1、创建事件处理程序;
   2、创建SAX解析器;
   3、将事件处理程序分配给解析器;
   4、对文档进行解析,将每个事件发送给处理程序;




实例:xml
   mypack.utils.FileUtils.java
   mypack.utils.HttpDownloader.java
   mypack.xml.MyContentHandler.java
   mypack.xml.XMLActivity.java


   XMLActivity.java


   String resultStr = httpDownloader.download("...");
   SAXParserFactory factory = SAXParserFactory.newInstance();
   XMLReader reader = factory.newSAXParser().getXMLReader();
   reader.setContentHandler(new MyContentHandler());
   reader.parse(new InputSource(new StringReader(resultStr))); // StringReader : 以流的方式处理字符串









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值