`
moshalanye
  • 浏览: 23923 次
  • 来自: ...
社区版块
存档分类
最新评论

SAX 解析 xml

阅读更多
该文章用公司技术分享,简单介绍,没有深入,期望javaeye们给与意见
    
    XML即扩展标志性语言,随着软件体系的不断的成长与发展,XML的使用已经超出了原先的设想,并由很多开源组织编写大量的规范,进一步扩大它的使用范围。

     作为程序员阅读XML之余,理解XML解析,也往往也会遇到解析自定义XML文件的情况,而解析XML也因情况使用不同的方式,以下介绍2种方式。

     第一种:
            自然是大家再熟悉不过的DOM树形式,一次性把XML文件读入内存,形成完整的DOM树。
            好处:容易理解的,开源api容易上手(例如:dom4j,jdom...)
            坏处:需要一次读入内存,处理大容量xml会出现内存溢出

    第二种:
            SAX,以流的方式处理XML,以缓存的方式陆续读取XML文件,event-base方式进行解析
            好处:基于流的方式,内存开销小,仅需要一定的缓存空间,event-base方式非常适合消息通信时,解析消息
            坏处:event-base,可读性较差,开发难度上升,不容易形成完整的DOM结构

以下以一个sample来介绍SAX的简单使用,在sample前我进行几个API的简单介绍
首先是 org 定义的sax的几个基础handler,每个handler都包含了对应不同事件的处理方法,通过复写这些方法即可自定义XML解析
     org.xml.sax.ContentHandler       //主要解析XML的API均包含在ContentHandler中
     org.xml.sax.EntityResolver 
     org.xml.sax.DTDHandler
     org.xml.sax.ErrorHandler

这些Handler提供的API即event-base的应对,替代了较早的org.xml.sax.DocumentHandler的作用,分工更细结构更清晰,详细可以参照jdk的注释
org.xml.sax.helpers.DefaultHandler 
   implements 
      EntityResolver, 
      DTDHandler, 
      ContentHandler, 
      ErrorHandler

是一个defaultHandler,适配了所有的事件应对接口,所以我们只需要复写defaultHandler的方法,
            SAXParser parser = saxFactory.newSAXParser();

并使用复写过的handler解析XML 
          
            parser.parse(inputSource , overwriteDefaultHandler );

以下是parse的API注释
 
    /**
     * Parse the content given [email={@link]{@link[/email] org.xml.sax.InputSource} as XML using the specified
     * @param is The InputSource containing the content to be parsed.
     * @param dh The SAX DefaultHandler to use.
     */
    public void parse(InputSource is, DefaultHandler dh)



以下附上
XML文件student.xml
SaxTest.java
见附件
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics