DOM概述:
DOM是一种典型的基于XML文档树状结构的解析技术。从概念上看,DOM的解析方式非常容易理解。DOM首先加载XML文档,并把XML树状结构存放到计算机内存中做进一步处理。
1.DOM与XML基于树状结构的解析模式
1.1XML基于树状结构的解析模式
XML文档中的文档类型描述、元素、属性、处理指令、注释和文本内容都可以视为状态树的节点。虽然从XML文档本身和XPath的角度来看,节点的含义略有不同,但是,一个XML文档能够被看作是按照一定层次结构分布的节点树。
当一个XML文档被以文档的形式加载到计算机内存以后,应用程序就能够像访问其他数据对象一样访问这个XML文档,并能够方便地对文档做出处理。DOM(Document Object Model)就是这样一种解析技术的典型代表。
由此可以看出,DOM对XML的处理方式与SAX处理方式完全不同。当SAX解析器处理XML文档时,xml文档中的节点逐一被读取和分析的。而在DOM解析器中,整个XML文档呗解析器加载,如果被加载的XML文档含有语法错误,DOM解析器在加载阶段都就能够发现并报告错误。因此DOM解析器不需要像SAX解析过程那样记录处理状态,解析过程没有SAX复杂。(事实上,大多数解析器在创建DOM树的过程都是采用SAX完成的)
DOM相对于SAX在XML文档内容处理上有比较大的优势。由于XML文档已经按照树状结构存储,对于应用程序来说,整个XML文档总是处于可以随时访问的状态。另外在应用程序中动态修改文档也十分容易。
DOM相对于SAX也有明显的不足。同样是由于XML文档被完整得存放到计算机内存中,计数机需要消耗数倍于原始XML文档的内存才能够在DOM解析以后处理内存中的树状结构。当处理大型XML文档时,DOM会因为内存容量消耗过大的原因而使程序效率大受影响。因此,采用DOM方式对应用程序的可伸缩性不利。它通常被用于解析和处理数据量比较少的XML文档。
1.2 Java DOM编程接口
DOM是由一组抽象化的接口组成。DOM接口定义了DOM编程规范。不同的DOM解析器通过不同的方法实现了这些接口。Node是整个Dom中最基本的数据类型,它代表了一个抽象的节点。XML文档的DOM树上的具体节点类型都是由Node类型派生而来。JAXP中的DOM接口可以由下图中的类图来表示
1. 如上所述,Node代表了DOM树中的一个抽象节点。它并没有一个确定的节点类型。DOM树中的一个具体节点都是有Node类型派生而来。每一种由Node派生的节点,可以通过测试它的对象类型得到节点类型,也可以由Node的getNodetype()方法获得。每一个节点还可以通过getNodeName()和getNodeValue()活得节点名和节点值。下表总结了Node接口的子接口的节点名、节点值和节点类型值的基本规律
2. Document
Document 节点代表了整个XML文档。当DOM解析一个XML文档以后,由XML形成的DOM节点树就是一Document对象的形式展现给应用程序的。由于XML文档的元素、处理指令、注释等都处于一个XML文档范围之内,Document中包含了用于创建元素、属性、注释、处理指令等其他节点类型的方法。
Node的normalize()方法提供了XML文档正规化的一种途径。当一个Document对象经过normalize()操作以后,相邻的文本(Text)节点被合并,空文本节点都将被去除。XML文档中的文本将通过元素、处理指令、注释和CDATA等加以分隔。
3. Element和Attr
一个Attr对象代表了元素的一个属性。DOM并不认为属性节点是整个文档树的一部分,因此从DOM的角度看,元素节点的父节点、同胞节点等都是null。属性节点能够通过getOwenerElement()方法得到当前属性所依附的元素。
一个Element对象代表了DOM树中的一个元素节点。除了在Node中定义的常规方法以外,Element还定义了一组方法用于获取元素中的属性、动态地增加一个属性或者动态删除一个属性等方法。
4.Entity 和 EntityReference
Entity代表了一个实体(而非实体描述)。DOM2中的实体节点有以下特点:不能修改实体(实体节点以及后代节点都是只读的)、实体节点没有父节点、不能解析名称控件前缀。
EntityReference代表了一个实体引用。与实体节点一样,实体引用节点以及后台节点也是只读的。EntityReference除了从Node继承下来的方法以外没有定义自己独有的方法。与实体不同的是,实体节点能够通过getPublicId()和getSystemId()过去公共和系统标识符,而实体引用节点没有这个能力。
5. Text 和 CDATSection
CDATSection用于代表XML文档中的CDATA部分的内容。DOM解析器只能识别CDATA的结尾标记"]]>",并以此作为CDATA的分节符。相邻的CDATASection节点不会被Node中的normalize()方法合并。
原文链接:https://www.f2er.com/xml/298286.html