DOM和SAX(Document Object Model)

来源:互联网 发布:sa2导弹数据 编辑:程序博客网 时间:2024/05/16 10:00

基于XML的程序结构如图

DOM、SAX是最主要的两种编程接口规范,Apache Xerces提供DOM和SAX API,支持多种语言

DOM概述

DOM是一个比XML更早的概念,例如IE中的DOM,可以通过JavaScript进行操作HTML
W3C的DOM可以看作是一个平台或语言的界面,允许程序和脚本动态地访问及更新文档的内容、结构、脚本程序。也就是说,DOM是一组API,它把XML文档作为对象,接口中包含了对文档的操作的属性和方法定义
DOM将XML文档看作树,根元素对应树的根节点,子元素对应子节点。利用DOM处理XML文档时,DOM处理器先把XML文档加载到内存中,在内存中,XML文档的逻辑结构以树的形式存在,对XML的操作都是建立在树的结构上的
DOM有3个版本,即DOM Level 1、2和3,已被MSXML等处理器支持的是1和2

DOM的结构

XML的所有一切都可以看作节点,包括文档本身、XML声明、注释、处理指令、根元素、子元素、元素的内容等

XML文档具有层次结构
根节点:对应整个XML文档,也叫文档节点
根元素:仅被文档节点饱含,也叫文档元素
注:属性节点不是元素节点的子节点

文档节点:是DOM树的根节点,根元素节点是它的一个子节点,接口为Document
元素节点:表示XML元素,可拥有子元素、文本子节点,是唯一具有属性的节点,接口为Element
文本节点:只能包含文本内容(或空白),可以使元素文本或属性值,接口为Text
属性节点:代表元素的属性,接口为Attr DOM树中实际没有属性节点,因为属性是依附于元素的
DOM的优缺点
优点:
整个文档结构和数据都在内存中,可以随时按照节点间的关系访问数据
节点的移动、插入、删除,结构和数据的修改,都在内存中进行
缺点:
受内存容量限制,不能处理大的文档
由于没有索引机制,处理效率较低
DOM的接口及实现
 W3C的DOM是用IDL(接口描述语言)描述的与操作系统和程序设计语言无关的接口规范,并未规定实现这一规范的类(Class)或结构(Structure)
 各软件厂商以软件包的形式实现DOM接口:
MSXML:支持DOM Level 2.0 core
JAXP:http://java.sun.com/j2se
DOM4j:可以看作JAXP的简化版http://www.dom4j.org

DOM程序设计

主要有三种用途:
处理XML文档:将XML加载至内存,以节点方式分析、处理XML文档,输出或保存XML文档
验证XML文档:将XML加载至内存,使用XML DTD或Schema验证XML文档
执行XSLT转换:加载XML、XSLT文档,并执行XSLT转换

SAX概述

SAX(Simple API for XML)采用流机制读取、分析XML文档。SAX由SAX项目组(http://www.saxproject.org)维护 ,Java源代码可到http://sourceforge.net下载
SAX是事件驱动的,包括解析器和处理器两部分。解析器对XML流进行解析,将元素、属性、文本、注释等作为“事件”顺序交由处理器进行处理。
SAX处理XML数据涉及以下步骤:
创建一个事件处理程序
创建 SAX 解析器
向解析器分配事件处理程序
解析文档,同时向事件处理程序发送每个事件
SAX在读取XML流的同时处理流
例如,对于XML文档:
<?xml version="1.0"?>
<samples>
 <server>UNIX</server>
 <monitor>color</monitor>
</samples>
分析该XML流时,一般将产生以下事件:
Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)
SAX API 允许开发人员捕捉这些事件并对它们作出反应
SAX解析器和处理器的接口定义位于org.xml.sax包中
XML解析器(XMLReader接口)
 允许应用程序设置、查询解析器的功能和特性,注册处理文档的事件处理器,启动文档解析
事件处理器(ContentHandler接口)
 SAX应用程序负责提供实现XMLReader接口的解析器类,其中事件处理器是要实现的主要的处理器之一,用于获得解析事件
错误处理器(ErrorHandler接口)
 要实现定制的错误处理,就必须实现该接口

SAX的特征

流式处理机制,边读取便分析,内存中只保留XML片断
对内存要求低,可处理大型文档
可随时中断处理,而不必等待全部XML处理完毕,避免加载不必要的数据,可充分利用内存资源
SAX处理器是顺序的,已经分析过的数据将不能再反复处理,不适合修改或随机访问XML文档