该文章用公司技术分享,简单介绍,没有深入,期望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解析
这些Handler提供的API即event-base的应对,替代了较早的org.xml.sax.DocumentHandler的作用,分工更细结构更清晰,详细可以参照jdk的注释
是一个defaultHandler,适配了所有的事件应对接口,所以我们只需要复写defaultHandler的方法,
并使用复写过的handler解析XML
以下是parse的API注释
以下附上
XML文件student.xml
SaxTest.java
见附件
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
见附件