您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第七章DOM接口技术讲解
第七章DOM接口技术主要内容DOM概述DOM规范主要接口JAXP、DOM和解析器JAXP读取XML文档信息JAXP编辑XML文档JAXP生成XML文档难点JAXP操作XML文档现在,应该开始研究XML文档的结构,以及如何利用它描述层次化信息。下面,我们将说明如何通过程序访问XML文档。其中一种方法是通过文档对象模型(DocumentObjectModel,DOM)。在本章中,我们将介绍文档对象模型,并借助几个程序实例解释它的功能。7.1什么是文档对象模型文档对象模型一词在Web浏览器领域并不陌生。窗口、文档和历史等对象都被认为是浏览器对象模型的一部分。然而,任何做过Web开发的人都知道各种浏览器实现这些对象的方式不尽相同。对于如何通过Web访问和操作文档结构这个问题,为了创建更加标准化的方法,W3C提出了目前的W3CDOM规范。W3CDOM是一种独立于语言和平台的定义,即:它定义了构成DOM的不同对象的定义,却没有提供特定的实现,实际上,它能够用任何编程语言实现。例如,为了通过DOM访问传统的数据存储,可以将DOM实现为传统数据访问功能之外的一层包装。利用DOM中的对象,开发人员可以对文档进行读取、搜索、修改、添加和删除等操作。DOM为文档导航以及操作HTML和XML文档的内容和结构提供了标准函数。7.1.1XML文档结构刚刚接触XML的开发人员常常会认为XML的主要目的是为文件中的信息片段命名,使之易于被其他人理解。结果,这些新手开发的文档简直如同“标记汤”—无序的数据元素列表与有意义的标记名称组合在一起,但是它与普通的文件一样都将信息置于同一层。?xmlversion=”1.0”?订单客户陈红/客户地址大学路100号地址城市南宁/城市产品芒果/产品数量30/数量产品荔枝/产品数量130/数量产品木瓜/产品数量60/数量/订单许多开发人员都忽略了XML能够显示元素之间的关系这一特性—特别是表示两个元素的父子关系。如果将上述文件改写为以下形式,将产生更好的效果:?xmlversion=”1.0”?订单客户姓名陈红/姓名地址大学路100号/地址城市南宁/城市/客户ITEM产品芒果/产品数量30/数量/ITEMITEM产品荔枝/产品数量130/数量/ITEMITEM产品木瓜/产品数量60/数量/ITEM/订单此文档在浏览器中的显示形式如图7.1所示。图7.1XML文档在IE浏览器中显示效果在这种形式的文档中,发票元素显然包括四个子元素。它还简化了文档的搜索—如果我们要寻找木瓜的所有订单,可以查询“产品”子元素为“木瓜”的ITEM元素—而不必依次查看每个“产品”元素。以上文档结构可以用图7.2中的节点树表示,它显示了所有元素以及它们之间的相互关系。如果要给文本文件中的发票增加项目,必须读取文件直至发票的最后一个项目的末尾,插入新的项目文本,然后继续处理文档的后续部分。正如你所料,这种技术很快会变得非常棘手,特别是当节点树变得越来越深时。然而,如果你能够根据树结构以节点形式对文档进行操作,添加项目就轻而易举了—只需创建新的ITEM节点,并将它作为“订单”节点的子节点。图7.2文档分层结构图这就是DOM的工作原理。当你使用DOM对XML文本文件进行操作时,它首先要解析文件,将文件分解为独立的元素、属性和注释等。然后,它以节点树的形式(在内存中)创建XML文件的表示。此后,开发人员可以通过节点树访问文档的内容,并根据需要修改文档。事实上,DOM执行了更进一步的操作,它将文档中的每个项目看作节点—元素、属性、注释、处理指令,甚至构成属性的文本。因此,对于我们上面的例子,DOM实际上会将文档表示为图7.3所示的形式。订单客户ITEMITEMITEM图7.3DOM节点树图图中文档为根节点,是访问整棵树的入口,其子节点可以是根元素、处理指令、注释等类型的节点。本图中根元素为“订单”,处理指令为?xmlversion=”1.0”?,注释本例没有。一般地讲,元素类型的节点可以有的子节点类型为元素类型和文本类型。本例中根节点的子节点为4个元素类型,客户和3个ITEM。客户节点又有三个元素型子节点“姓名”、“地址”和“城市”。每个ITEM节点包含两个元素“产品”和“数量”。图中最后一行中的节点类型为文本型的节点是分析时需要特别注意的地方,因为稍不注意就可能认为姓名的值为陈红而不是将之作为两个不同类型的节点。在DOM节点树分析中还有一点需特别注意,有些元素含有属性,属性类型的节点也出现在DOM树中,它只能和元素类型的节点相关联,而且不是作为元素类型的子节点出现的,以和子元素相区别。5.1.2DOM规范与其他Internet标准一样,DOM规范也是由W3C维护的。W3C提出了两个DOM文档—Level1和Level2文档。1.DOMLevel1Level1文档包含两个主要部分。第一部分,文档对象模型(核心)Level1定义了用于访问任何结构化文档的接口,以及用于访问XML文档的特殊扩展。文档的第二部分描述了元素:订单元素:客户元素:ITEM元素:ITEM元素:ITEM文档元素:姓名元素:地址元素:城市元素:产品元素:数量元素:产品元素:数量元素:产品元素:数量文本:陈红文本:大学路文本:南宁文本:芒果文本:30文本:荔枝文本:130文本:木瓜文本:60?xmlversion=”1.0”?DOM针对HTML的扩展,它超出了本书的讨论范围。DOM规范通过定义数据类型DOMString描述了DOM如何操作字符串。该数据类型定义为双字节字符集,采用UTF-16编码机制进行编码。对于特定的实现,接口通常被绑定到也采用UTF-16编码的系统数据类型,例如:Java的String类型。2.DOMLevel2Level2规范不仅包含上述所有对象,而且新增了以下特征:•支持命名空间—正如我们将在第7章中看到的,命名空间用于区分XML中具有相同名称的离散数据元素。它们通常提供返回原始的XML结构文件的链接,该文件包含某种格式的元素信息。DOMLevel2将提供查询和修改文档命名空间的机制。•样式表—DOMLevel2包含样式表的对象模型,以及用于查询和操作特定文档的样式表的方法。•过滤—DOMLevel2新增了用于过滤XML文档内容的方法。•事件模型—DOMLevel2计划提供XML的事件模型。•范围(Range)—DOMLevel2包含用于操作大块文本的函数,它有助于在XML中处理传统的文档。3.理解IDL和绑定W3C将DOM定位为独立于平台的,即:W3C指定了特定系统的实现需要提供哪些方法和属性,但没有详细说明如何获得这些实现。为此,W3C选择通过以下几种方式表达与DOM的接口:通过OMGIDL(它是CORBA2.2规范的一部分),而CORBA是分布式计算中广泛使用的中间件,独立于软件和硬件平台。现在DOM已经得到广泛的支持,比如VBScript、JavaScript、VB、ASP、php和Java等。本书以Java技术为例介绍。7.2DOM对象XMLDOM把XML文档视为一种树结构。这种树结构被称为节点树。可通过这棵树访问所有节点。可以修改或删除它们的内容,也可以创建新的元素。W3CDOM仅仅提供了DOM类库的接口定义,而没有提供特定的实现。编写通过DOM访问XML文件的软件时,必须使用特定的DOM实现。实现是某种形式的类库,它设计为运行在特定的硬件和软件平台上,并访问特定的数据存储。下面对DOM的基本接口做一个简单的介绍。7.2.1DOM基本接口在DOM接口规范中有许多接口,其中最基本的接口为Document,Node,NameNodeMap,NodeList。在这四个基本接口中Node接口是其它大多数接口的父接口,Document、Element、Attribute、Text、Comment等接口都继承自Node接口。Document接口是对文档进行操作的入口,对应于DOM树的根节点。NodeList接口是节点的集合,它包含某个节点的所有子节点。NameNodeMap接口也是节点的集合,通过该接口可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定节点,常用于某元素节点的所有属性的操作。下面对这四个接口分别做一些介绍。1.Document接口Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作的入口。由于元素、文本节点、注释、处理指令等都不能脱离文档的上下文关系而独立存在,所以在Document接口提供了创建其他节点对象的方法,通过该方法创建的节点对象都有一个ownerDocument属性,用来表明当前节点是由谁所创建的以及节点同Document之间的联系。Document节点是DOM树中的根节点,也即对XML文档进行操作的入口节点。通过Docuemt节点,可以访问到文档中的其他节点,如处理指令、注释、文档类型以及XML文档的根元素节点等等。另外,在一棵DOM树中,Document节点可以包含多个处理指令、多个注释作为其子节点,而文档类型节点和XML文档根元素节点都是唯一的。2.Node接口Node接口在整个DOM树中具有举足轻重的地位,DOM对象模型接口中有很大一部分接口是从Node接口继承过来的,例如,Element、Attr、CDATASection等接口,都是从Node继承过来的。在DOM树中,Node接口代表了树中的一个节点。Node接口提供了访问DOM树中元素内容与信息的途径,并给出了对DOM树中的元素进行遍历的支持。3.NodeList接口NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,它还出现在一些方法的返回值中,例如GetNodeByName。在DOM对象模型中,NodeList的对象是live的,换句话说,对文档的改变,会直接反映到相关的NodeList对象中。例如,如果通过DOM获得一个NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操作(添加、删除、改动节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需DOM对象模型应用程序再做其他额外的操作。NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。4.NamedNodeMap接口实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集合。不过注意,NamedNodeMap并不是从NodeList继承过来的,它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简单方法,并不表明在DOM对象模型规范中为NamedNodeMap中的节点规定了一种排列顺序。NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。与NodeList相同,在DOM中,NamedNodeMap对象也是live的。除上面的四个基本接口,常用的接口还有Element接口、Text接口、CDATASection接口、Attr接口等。其中Element接口继承自Node接口,表示XML或HTML文档中的一个元素。元素可能与有与之相关的属性,由于Element继承Node,所以可以使用Node接口属性attributes来获得元素所有属性的集合。Element接口上有通过名称获得Attr对象或属性的方法。在XML中,应该获得Attr对象来检查表示属性值的可能相当复杂的子树。Text接口继承CharacterData,并且表示Element或Att
本文标题:第七章DOM接口技术讲解
链接地址:https://www.777doc.com/doc-3203829 .html