【1】 DOM概述
(1) DOM简介 DOM的中文含义为文档对象模型,由一组代表HTML文档或者XML文档中不同组成部分的程序对象组成,这些对象提供了各自的属性和方法,使得应用程序开发者能够通过编写脚本程序来操纵和显示文档中相应的组件。 使用DOM技术访问XML文档,具有强大的功能和灵活性,不仅可用来编写访问本地XML文档的程序,还可用来编写访问服务器端XML文档的应用程序。 可以把DOM看作是一种ActiveX对象,它绑定封装了若干个对XML文档进行访问的API,应用程序开发者能够使用脚本语言来调用DOM对象的属性与方法,达到访问、操作XML文档各个组成部分的目的。 DOM 以树状的层次节点来储存XML文档中的所有数据,可以使用DOM节点树来访问任何形式的XML文档,并且可以使用DOM提供的编程接口来显示和操纵XML文档中的任何组件,包括元素、属性、处理指令、注释及实体等。
(2) DOM与SAX 除了DOM方式之外,XML技术还提供了SAX方式来读取和处理XML文档的数据。SAX的英文名称为Simple API for XML,即应用于XML的简单API。 DOM的运作方式是将整个文档读入内存,并根据文档中定义的元素及其属性构建一个树型结构用来描述该文档。DOM方式提供了直接指向XML文档各组成部分的API,给程序设计带来了方便。但是,由于DOM方式首先将整个文档载入内存,然后生成一颗相应的节点对象树,当XML文档的数据量比较大或文档结构比较复杂时,将要占据大量的内存空间,其解析过程也会需要比较长的时间。 SAX方式针对处理大型XML文档和高吞吐量的情况作了优化,它会遍历整个文档,并逐一访问文档中的每一项内容。SAX方式的优点是:无论XML文档有多大,都只将下一项内容载入内存中。因为忽略了为文档内容创建一颗对象树的过程,而能更快地执行。 与DOM方式相比,SAX方式对XML文档的处理缺乏一定的灵活性和规范性,并且SAX应用程序一般都比较长,所以本章将只介绍通过DOM方式对XML文档的访问与处理。
(3) DOM结构树,其实应该说是XML文档的结构树 当IE浏览器内含的XML解析器处理被载入的XML文档并根据文档的逻辑结构生成一棵对应的DOM树时,它会为XML文档中的每一个基本组件建立一个树中的对应节点。这些基本组件包括元素、属性、注释、实体与处理指令等,DOM会使用不同类型的节点来代表不同类型的XML组件。下表列出了DOM节点的各种类型及简短说明。
节点类型 |
说明 |
节点名称 |
Document |
文档根节点(代表整个XML文档) |
#document |
Element |
元素节点 |
元素的实际名称 |
Attribute |
属性节点 |
属性的实际名称 |
Text |
属于元素或属性的文本内容 |
#Text |
Processing Instruction |
处理指令节点 |
处理指令的实际名称 (例如xml) |
CDATA Section |
CDATA 区段 |
#cdata-section |
DocumentType |
代表 <!DOCTYPE...> 的节点 |
DTD声明中的文档类型名称 |
Entity |
DTD 中的 <!ENTITY...> 声明 |
实体名称(例如image) |
Notation |
DTD 中的符号声明 |
符号名称(例如BMP) |
Comment |
注释节点 |
#Comment |
【2】 DOM对象架构 (1) DOM对象概述:IE浏览器支持的XML DOM为应用程序操纵和处理XML文档提供了各种DOM对象,下表列出了各种XML DOM对象及其对应节点的简短说明。 (2) 各种XML的DOM对象如下表所示:
对 象 |
说 明 |
XMLDOMDocument |
表示DOM树的最顶层节点,即根节点 |
XMLDOMNode |
表示DOM树中除根节点之外的某一个节点 |
XMLDOMNodeList |
表示某个父节点之下的一系列兄弟节点的集合 |
XMLDOMParseError |
返回错误信息,包括错误编号、出错位置等一些相应的描述信息 |
XMLDOMAttribute |
代表一个属性节点 |
DocumentType |
代表文档类型描述的相关信息 |
(3) 每一个不同的节点对象都有其特定的属性和方法,但也有许多共同的属性,表中列出了各种类型节点对象共有的一组属性。
属 性 |
说 明 |
attributes |
返回包含该节点所有属性的NamedNodeMap集合(只读) |
childNodes |
返回包含该节点所有非属性子节点的NodeList集合(只读) |
dataType |
返回该节点数据类型(可读写) |
firstChild |
该节点的第一个非属性的子节点(只读) |
lastChild |
该节点的最后一个非属性子节点(只读) |
nextSibling |
返回位于同一层级的下一个节点(只读) |
nodeName |
返回该节点的名称(只读) |
nodeType |
返回表示该节点类型的数值码(只读) |
nodeTypeString |
返回表示该节点类型的字符串(小写字母撰写,只读) |
nodeTypeValue |
返回该节点类型的值(可读写) |
nodeValue |
返回该节点的值(如果不含值则为null)(可读写) |
ownerDocument |
返回包含本节点的Document根节点(只读) |
parentNode |
返回该节点的父节点(不适用于Attribute节点,只读) |
previousSibling |
与本节点位于同一层级的前一个节点(只读) |
text |
该节点与其后裔节点的全部文字内容(可读写) |
xml |
该节点与其后裔节点的全部XML 内容(只读) |
除了共同具有的属性之外,各种类型的节点对象都提供了特有的属性和方法,来处理该节点类型所代表的特殊XML文档组件。 通过XML DOM对象的层次架构及其相关的属性,程序员可以从当前节点出发访问各个节点的信息。 (4) Document对象 Document对象代表XML DOM树的根节点,同时代表了整个XML文档。该对象提供了对整个文档或文档中的数据进行访问和操作的许多属性和方法。 由于其他节点都是Document节点的子节点,所以通过Document对象可以访问文档中的各种节点,包括处理指令、注释、文档类型声明及根元素节点等。 下表列出了Document对象的一些特有属性。
属 性 |
说 明 |
async |
默认值为TRUE,表示同步载入文档;若为FALSE,则为异步载入 |
docType |
返回DTD的DocumentType节点 |
documentElement |
返回文档的根元素节点 |
nameSpaceURL |
返回命名空间的URL值 |
onDataAvailable |
若此属性指定为撰写的函数名称,当XML 数据可取得时将调用该函数 |
onReadyStateChange |
若将此属性指定为撰写的函数名,当document的readyState属性改变时,将调用该函数 |
parsed |
若所有子节点已被解析,返回TRUE,否则返回FALSE |
parseError |
返回处理XML 文件时发生的任何错误信息 |
readyState |
载入和处理XML文档的当前状态。0代表uninitialized、1代表loading、2代表loaded、3代表 interactive、4代表completed |
url |
载入的XML文档的URL值 |
(5) Document对象的常用方法及其说明
方 法 |
说 明 |
abort |
终止XML文档的异步加载 |
appendChild(newChild) |
为当前节点增加一个子节点 |
cloneNode(deep) |
复制当前节点,若deep为TRUE,连同所有子节点一起复制;若deep为FALSE,仅复制当前节点本身 |
createAttribute(name) |
创建一个属性 |
createCDATASection(data) |
创建一个CDATA区段 |
createComment(data) |
创建一个注释 |
createElement(name) |
创建一个元素 |
createEntityReference(name) |
创建一个实体参考 |
createNode(type,name,namespaceURL) |
创建一个指定类型和名称的节点 |
createProcessionInstruction(target,data) |
创建一个处理指令 |
createTextNode(text) |
创建一个指定内容的文本节点 |
getElementsByTagName(name) |
返回文档中拥有特定类型名称的所有元素列表。如果参数为“*”将返回所有元素 |
hasChildNodes |
若当前节点有子节点,返回TRUE;否则返回FALSE |
insertBefore(newNode,refNode) |
将一个newNode插入到refNode之前 |
load(URL) |
载入并解析由URL指定的文档 |
loadXML(stringDoc) |
载入并解析由stringDoc指定的XML文档 |
nodeFromID (id-value) |
返回ID 类型属性值为id-value一个节点 |
removeChild(Child) |
删除指定的子节点 |
replaceChild(newChild,oldChild) |
用newChild子节点替代oldChild子节点 |
save(stringDoc) |
将DOM树数据存入由stringDoc指定的XML文档 |
selectNodes(pattern) |
取得符合指定类型的所有节点 |
selectSingleNodes(pattern) |
取得符合指定类型的第一个节点 |
transformNode(stylesheetObj) |
用含有指定的样式表对象实例来转换XML文档,将转换结果以字符串形式返回 |
transformNodeToObject (stylesheetObj,outObj) |
用含有指定的样式表对象实例来转换XML文档,并将转换结果写入到outObj对象 |
(6) Node对象 在XML DOM树中,除了根节点之外,每一个节点都是一个Node对象。所以Node对象可以对应于XML文档中的任意一个元素、属性、处理指令或注释等。 Node对象所具有的属性与所有对象共有的属性基本相同,利用Node对象具有的一些方法则可操纵当前节点及其子节点。 Node对象的常用方法及其说明
方 法 |
说 明 |
appendChild(newChild) |
为当前节点增加一个子节点 |
cloneNode(deep) |
复制当前节点,若deep为TRUE,连同所有子节点一起复制;若deep为FALSE,则仅复制当前节点本身 |
hasChildNodes |
若当前节点有子节点返回TRUE,否则返回FALSE |
insertBefore(newNode,refNode) |
将一个newNode插入到refNode之前 |
removeChild(Child) |
删除指定的子节点 |
replaceChild(newChild,oldChild) |
用newChild替代oldChild |
selectNodes(pattern) |
取得符合指定类型的所有节点 |
selectSingleNodes(pattern) |
取得符合指定类型的第一个节点 |
transformNode(styleSheetOBJ) |
利用指定的样式表来变换当前节点及其子节点 |
(7) NodeList对象 NodeList对象是一系列相关节点的集合。例如,引用某个节点的childNodes 属性将返回一个包含该节点所有非属性子节点的NodeList对象。此外,调用某个节点对象的getNodeByName方法或者selectNodes方法,也可获得一个相应的NodeList对象。 要从NodeList 集合对象中取得一个指定的子节点,可以调用NodeList 对象的item 方法,并给出想取得的子节点的索引值(注意:子节点的索引值由零开始)。 NodeList 对象只有一个名为length的属性,用来表示NodeList 集合中子节点的个数。 NodeList 对象常用方法
方 法 |
说 明 |
item |
依给出的索引值,返回所要的节点,索引值0表示第一个节点 |
reset |
内部指针指向节点集合中第一个节点位置之前,使得当下一个节点被调用时,指向第一个节点 |
nextNode |
内部指针指向节点集合中的下一个节点 |
(8) ParseError对象 ParseError对象用来报告载入和解析XML文档时产生的错误。 ParseError对象没有提供有关的方法,而提供了多个属性来分别表示出错的代号、出错文档的URL、文档中出错的位置以及出错原因等信息。 ParseError 对象常用属性
属 性 |
说 明 |
errorCode |
用十进制数表示的出错代号,若此数为零,表示没有发生错误 |
filepos |
出错文档的绝对位置 |
line |
文档中出错的行 |
linepos |
文档中出错行内的出错位置 |
reason |
用文字描述的出错原因 |
srcText |
文档中出错的源代码 |
url |
出错文档的URL | 9 DOM客户端编程访问XML 在客户端编程中建立DOM 在客户端利用DOM对象编程来访问本地XML文档,最简单的方法就是将XML文档载入并绑定到某个HTML文档,在该HTML文档中建立一个数据源对象DSO。此后,通过由ID属性指定的标识符便可引用这个DSO。并可以进一步使用DSO的对象成员XMLDocument来访问DOM。 在HTML网页中建立XML DOM对象的常用方式是,首先创建一个MSXML所支持的DOMDocument对象实例,然后再调用其load方法载入指定的XML文档,建立起DOM结构树与XML文档之间的关联。 【3】 采用DOM技术利用ASP访问XML文档 1 显示单记录XML文档数据 2 显示多记录XML文档数据 3 查询指定的XML元素数据 4 访问XML文档的属性值 5 测试XML文档的有效性 【4】 DOM服务器端编程访问XML方法: 1 ASP编程环境与DOM 1.建立ASP的运行环境,ASP是一种在服务器端运行的脚本程序,所以在开发和测试ASP网络应用程序之前,必须建立可供ASP程序运行的Web服务器工作环境。 因为ASP是Microsoft公司推出的,只有在Windows操作系统及其配套的Web服务器软件IIS支持下才能运行。 在成功安装IIS软件之后,再做一些简单的设置,就可以将自己的机器设定成一台虚拟的Web服务器。 2.在ASP编程中创建XML DOM 使用JavaScript创建XML DOM对象实例,应使用如下代码之一: var xmldoc = Server.CreateObject("MSXML.DOMDocument"); var xmldoc = Server.CreateObject("Microsoft.XMLDOM"); 3. 使用VBScript创建XML DOM对象实例,应使用如下代码之一: set xmldoc = Server.CreateObject("MSXML.DOMDocument") set xmldoc = Server.CreateObject("Microsoft.XMLDOM") 此外,加载XML文档时需要使用ASP提供的Server对象的MapPath方法将相对路径映射为网络路径。 2 ASP编程创建XML文档 可以利用DOM对象进行ASP编程来创建XML文档。具体步骤为: 1.调用Server对象的CreateObject方法创建一个Document对象实例。 2.调用Document对象的loadXML方法,将字符串形式的XML声明语句和文档根元素节点存入内存缓冲区中的DOM树。 3.在根元素下创建各个子元素节点。 4.为元素添加属性。 5.当所有的元素创建完毕后,调用Document对象实例的Save方法将内存中的DOM树内容存入指定的XML文档。 3 ASP编程遍历XML文档 书中的ASP程序范例DomTraverse1.asp,是通过遍历DOM树的节点来访问和显示服务器端XML文档Customer.xml的所有元素数据。 该范例程序首先创建一个XML DOM对象实例,然后载入指定的Customer.xml文档。此后主要是通过创建一个递归函数traverse() 来实现遍历所有的DOM节点。函数代码中使用了当前节点的childNodes属性来获得一个NodeLists集合对象,并通过循环语句来逐个显示该集合中各个节点的文本内容。 4 ASP编程添加XML数据 利用DOM技术结合ASP编程可以为服务器端的XML文档添加新的元素,这是通过为该文档的 DOM树添加相应的节点来实现的。 书中的DomAppend.htm文档是用来添加新客户数据的表单网页,用户在该网页表单提供的文本框中输入完数据后,单击“提交”按钮,将激活一个名为DomAppend.asp的脚本程序,该程序负责接收在表单中输入的各项数据、创建XML DOM对象实例并载入指定的Customer.xml文档、新建若干子节点、给新节点赋值等,并最终生成添加数据后的XML文档。 5 ASP编程修改XML数据 利用DOM与ASP编程的方式还可以实现对XML文档中的指定数据进行修改和更新。书中的范例程序DomModify1.asp就是在Customer.xml客户数据文档中,将“红阳商贸”公司的联系人更新为“王大海”。 6 ASP编程转换XML文档 利用DOM对象与ASP编程还可以依照相应XSL样式表的规定,将指定的XML文档转换为标准的HTML文档并在浏览器中显示出来。具体步骤为: 为需要转换的XML文档设计并创建一个XSL样式表文件; 创建两个DOMDocument对象实例,用来分别载入被转换的XML文档和创建好的XSL样式表文件; 调用Document对象的transformNode方法,依照这个样式表将XML文档转换为相应的HTML文档; 将转换后的HTML文档在浏览器中显示出来。 |