DOM模型:
1、什么是DOM?
DOM 定义了访问诸如 XML 和 XHTML 文档的标准。
“W3C 文档对象模型(DOM)是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的平台和语言中立的接口。”
DOM 将 XML 文档作为一个树形结构,而树叶被定义为节点。DOM定义了一个Node接口,用于表示文档树中一个节点。从Node接口派生出了更多的具体接口,例如Document接口、Element接口、Attr接口。
2、节点类型
DOM 是这样规定的:
- 整个文档是一个文档节点
- 每个 XML 标签是一个元素节点
- 包含在 XML 元素中的文本是文本节点
- 每一个 XML 属性是一个属性节点
- 注释属于注释节点
3、DOM解析器工厂模式
在javax.xml.parsers包中定义了DOM解析器工厂类DocumentBuildFactory,用于产生DOM解析器。DocumentBuildFactory是一个抽象类,在这个类中提供了一个静态的方法newInstance( ),用于创建工厂类的一个实例。
DocumentBuildFactory factory = DocumentBuildFactory.newInstance();
DoucmentBuild build = factory.newDocumentBuilder();
DocumentBuild类也是一个抽象类,调用DocumentBuildFactory的newInstance( )方法得到具体厂商的工厂类的实例后,再利用其newDocumentBuilder( )方法,得到具体厂商的DOM解析器对象。
DocumentBuilder类提供了parse()方法,用于解析XML文档的内容,返回一个表示整个文档的Document对象。Parse()方法的参数可以是File类、InputSource类、InputStream类或表示XML文件的URI。
4、DOM缺点:在使用DOM解析XML文档是,需要读入整个XML文档,然后在内存中创建DOM树,生成DOM树上的每个节点对象。只有在整个DOM树创建完成后,才能进行其它的操作。当XML文档比较大时,构建DOM树将花费大量的时间和内存。
SAX(Simple API For XML):
1、什么是SAX
SAX 是基于事件驱动的API。用SAX模型来解析xml文档时,要涉及到解析器和事件处理器。解析器负责解析xml文档,并向事件处理器发送请求;而事件处理器负责对事件作出响应,对传递的XML数据进行处理
2、解析器产生的事件
SAX在解析文档时,一般会依次产生下列事件:
文档开始
元素开始
字符数据(可能是XML文档中的空白部分)
元素开始
字符数据
元素结束
字符数据
元素结束
文档结束
事件处理器中对事件做出响应的方法也叫做回调方法(callback method)。
3、解析器、事件处理器
XMLReader是SAX2.0解析器必须实现的接口,这个接口允许应用程序设置和查询解析器功能和特性,可以注册用户自定义的事件处理器,以及文档解析。解析器提供商负责提供实现XMLReader接口的解析器类,用户只需编写事件处理器程序即可。
ContentHandler接口是一个主要的事件处理器接口。如果应用程序要获得基本的解析事件,它就要实现这个接口,并使用XMLReader对象的setContentHandler()方法向解析器注册一个ContentHandler实例。解析器使用这个实例来报告与文档相关的基本事件。
4、SAX解析器工厂类
JAXP也为SAX解析器提供了工厂类——SAXParserFactory类。SAX解析器工厂类的实例与DOM解析器工厂类的实例类似,都是通过newInstance( )方法来创建的。JAXP中定义的SAX解析器类是SAXParser(相当于DOM中的DocumentBuilder类,获取方法也类似)。实际上SAXParser是JAXP对XMLReader实现类的一个包装类。在SAXParser中定义了返回XMLReader实例的方法getXMLReader( )。而XMLReader和SAXParser中都有parse( )方法,并且是等效的。但SAXParser中的parse( )方法使用范围更广,因为它能接受更多的参数,对不同的XML文档数据源进行解析。