• 1. 第7章 使用DOM访问XML文档
  • 2. 讲解内容1.DOM概述 2.DOM对象架构 3.DOM客户端编程访问XML 4.DOM服务器端编程访问XML
  • 3. XML文档可以在不同应用平台之间共享和传递数据,如何读取和处理这些XML文档数据? DOM:文档对象模型SAX:用于XML的简单的API
  • 4. 7.1 DOM概述7.1.1 DOM简介 DOM的中文含义为文档对象模型;它定义了访问和操作XML文档的标准方法 。 DOM不仅可用来编写访问本地XML文档的程序,还可用来编写访问服务器端XML文档的应用程序。 DOM 将 XML 文档作为一个树形结构,而树叶被定义为节点。
  • 5. DOM概述DOM运作方式:将整个XML文档读入内存,并根据文档中定义的元素及属性构件一个树形结构来描述文档。 DOM与平台无关,允许程序和脚本动态地访问和修改XML文档的内容、结构和类型。 W3C定义了一系列对象和方法对DOM树的节点进行各种随机操作。DOM方式提供了指向XML文档的各个组成部分的API。 包括元素、属性、处理指令、注释及实体等
  • 6. DOM节点的各种类型节点类型说 明节点名称Document文档根节点 (代表整个XML文档)#documentElement元素节点元素的实际名称 Attribute属性节点属性的实际名称Text属于元素或属性的文本内容#TextProcessing Instruction 处理指令节点处理指令的实际名称 (例如xml)
  • 7. <客户列表> <客户> <公司名称>东南实业 <联系人 职位="销售经理">王先生 <电话>65656565 <客户> <公司名称>红阳商贸 <联系人 职位="销售代表">刘小组 <电话>57575751
  • 8. DOM结构树
  • 9. 注意: 须弄清楚每个节点的类型,因为不同类型的节点对应不同的对象,具有各自不同的属性和方法,这些不同的树形和方法也决定了如何对其进行操作。
  • 10. DOM工作方式:应用程序DOMXML解析器XML文档应用程序通过DOM API来访问该属性结构中的节点,查询或修改文档的数据。DOM加载文档并在内存中根据文档中定义的元素和属性来构建一棵文档树XML解析器检查文档是否格式良好并在请求的情况下对文档进行有效性检验。
  • 11. 7.2 DOM对象架构7.2.1 DOM对象概述 开发者如何从XML文档中读取、搜索、修改、增加和删除文档中的数据。改变XML显示的方式?-----XML DOM对象解决 IE浏览器支持的XML DOM为应用程序操纵和处理XML文档提供了各种DOM对象,表7-2列出了各种XML DOM对象及其对应节点的简短说明。 DOM对象提供的对象和方法可以和任何编程语言(java,c#,c++)一起使用,也可以和脚本语言结合使用。
  • 12. 表7-2 各种XML DOM对象对 象说 明XMLDOMDocument表示DOM树的最顶层节点,即根节点XMLDOMNode表示DOM树中除根节点之外的某一个节点XMLDOMNodeList表示某个父节点之下的一系列兄弟节点的集合XMLDOMParseError返回错误信息,包括错误编号、出错位置等一些相应的描述信息XMLDOMAttribute代表一个属性节点XMLDOMDocumentType代表文档类型描述的相关信息
  • 13. 属 性说 明attributes返回包含该节点所有属性的NamedNodeMap集合(只读)childNodes返回包含该节点所有非属性子节点的NodeList集合(只读)dataType返回该节点数据类型(可读写)firstChild该节点的第一个非属性的子节点(只读)lastChild该节点的最后一个非属性子节点(只读)nextSibling返回位于同一层级的下一个节点(只读)nodeName返回该节点的名称(只读)nodeType返回表示该节点类型的数值码(只读)每一个不同的节点对象都有其特定的属性和方法,但也有许多共同的属性
  • 14. 属 性说 明nodeTypeString返回表示该节点类型的字符串 (小写字母撰写,只读)nodeTypeValue返回该节点类型的值(可读写)nodeValue返回该节点的值(如果不含值则为null) (可读写)ownerDocument返回包含本节点的Document根节点(只读)parentNode返回该节点的父节点 (不适用于Attribute节点,只读)previousSibling与本节点位于同一层级的前一个节点(只读)text该节点与其后裔节点的全部文字内容(可读写)xml该节点与其后裔节点的全部XML 内容(只读)
  • 15. 除了共同具有的属性之外,各种类型的节点对象都提供了特有的属性和方法,来处理该节点类型所代表的特殊XML文档组件。 通过XML DOM对象的层次架构及其相关的属性,程序员可以从当前节点出发访问各个节点的信息。
  • 16. 7.2.2 Document对象Document对象代表XML DOM树的根节点,同时代表了整个XML文档。该对象提供了对整个文档或文档中的数据进行访问和操作的许多属性和方法。 由于其他节点都是Document节点的子节点,所以通过Document对象可以访问文档中的各种节点,包括处理指令、注释、文档类型声明及根元素节点等。
  • 17. 表7-4 Document 对象的特有属性属 性说 明async默认值为TRUE,表示同步载入文档;若为FALSE,则为异步载入docType返回DTD的DocumentType节点documentElement返回文档的根元素节点nameSpaceURL返回命名空间的URL值onDataAvailable若此属性指定为撰写的函数名称,当XML 数据可取得时将调用该函数onReadyStateChange若将此属性指定为撰写的函数名,当document的readyState属性改变时,将调用该函数
  • 18. 属 性说 明parsed 若所有子节点已被解析,返回TRUE,否则返回FALSEparseError 返回处理XML 文件时发生的任何错误信息readyState 载入和处理XML文档的当前状态。 0代表uninitialized、 1代表loading、 2代表loaded、 3代表 interactive、 4代表completedurl载入的XML文档的URL值
  • 19. 表7-5 Document对象的常用方法及其说明方 法说 明abort终止XML文档的异步加载appendChild(newChild)为当前节点增加一个子节点cloneNode(deep)复制当前节点,若deep为TRUE,连同所有子节点一起复制;若deep为FALSE,仅复制当前节点本身createAttribute(name)创建一个属性createCDATASection(data)创建一个CDATA区段createComment(data)创建一个注释createElement(name)创建一个元素
  • 20. 方 法说 明createEntityReference (name)创建一个实体参考createNode (type,name,namespaceURL)创建一个指定类型和名称的节点createProcessionInstruction (target,data)创建一个处理指令createTextNode(text)创建一个指定内容的文本节点getElementsByTagName (name)返回文档中拥有特定类型名称的所有元素列表。如果参数为“*”将返回所有元素
  • 21. 方 法说 明hasChildNodes若当前节点有子节点,返回TRUE;否则返回FALSEinsertBefore (newNode,refNode)将一个newNode插入到refNode之前load(URL)载入并解析由URL指定的文档loadXML(stringDoc)载入并解析由stringDoc指定的XML文档nodeFromID (id-value)返回ID 类型属性值为id-value一个节点removeChild(Child)删除指定的子节点replaceChild (newChild,oldChild)用newChild子节点替代oldChild子节点
  • 22. 方 法说 明save(stringDoc)将DOM树数据存入由stringDoc指定的XML文档selectNodes(pattern)取得符合指定类型的所有节点selectSingleNodes (pattern)取得符合指定类型的第一个节点transformNode (stylesheetObj)用含有指定的样式表对象实例来转换XML文档,将转换结果以字符串形式返回transformNodeToObject (stylesheetObj,outObj)用含有指定的样式表对象实例来转换XML文档,并将转换结果写入到outObj对象
  • 23. 7.2.3 Node对象在XML DOM树中,除了根节点之外,每一个节点都是一个Node对象。所以Node对象可以对应于XML文档中的任意一个元素、属性、处理指令或注释等。 Node对象所具有的属性与所有对象共有的属性基本相同,利用Node对象具有的一些方法则可操纵当前节点及其子节点。
  • 24. 表7-6 Node对象的常用及其说明方 法说 明appendChild (newChild)为当前节点增加一个子节点cloneNode(deep)复制当前节点,若deep为TRUE,连同所有子节点一起复制;若deep为FALSE,则仅复制当前节点本身hasChildNodes若当前节点有子节点返回TRUE,否则返回FALSE
  • 25. 方 法说 明insertBefore (newNode,refNode)将一个newNode插入到refNode之前removeChild (Child)删除指定的子节点replaceChild (newChild,oldChild)用newChild替代oldChildselectNodes (pattern)取得符合指定类型的所有节点selectSingleNodes (pattern)取得符合指定类型的第一个节点transformNode (styleSheetOBJ)利用指定的样式表来变换当前节点及其子节点
  • 26. 7.2.4 NodeList对象NodeList对象是一系列相关节点的集合。例如,引用某个节点的childNodes 属性将返回一个包含该节点所有非属性子节点的NodeList对象。此外,调用某个节点对象的getNodeByName方法或者selectNodes方法,也可获得一个相应的NodeList对象。表7-7则为NodeList 对象的方法及简要说明。
  • 27. 要从NodeList 集合对象中取得一个指定的子节点,可以调用NodeList 对象的item 方法,并给出想取得的子节点的索引值(注意:子节点的索引值由零开始)。 NodeList 对象只有一个名为length的属性,用来表示NodeList 集合中子节点的个数。
  • 28. 表7-7 NodeList 对象常用方法方 法说 明item依给出的索引值,返回所要的节点,索引值0表示第一个节点reset内部指针指向节点集合中第一个节点位置之前,使得当下一个节点被调用时,指向第一个节点nextNode内部指针指向节点集合中的下一个节点
  • 29. 7.2.5 ParseError对象ParseError对象用来报告载入和解析XML文档时产生的错误。 ParseError对象没有提供有关的方法,而提供了多个属性来分别表示出错的代号、出错文档的URL、文档中出错的位置以及出错原因等信息。
  • 30. 表7-8 ParseError 对象常用属性属 性说 明errorCode用十进制数表示的出错代号,若此数为零,表示没有发生错误filepos出错文档的绝对位置line文档中出错的行linepos文档中出错行内的出错位置reason用文字描述的出错原因srcText文档中出错的源代码url出错文档的URL
  • 31. 7.3 DOM客户端编程访问XML7.3.1 在客户端编程中建立DOM 在客户端利用DOM对象编程来访问本地XML文档,最简单的方法就是将XML文档载入并绑定到某个HTML文档,在该HTML文档中建立一个数据源对象DSO。此后,通过由ID属性指定的标识符便可引用这个DSO。并可以进一步使用DSO的对象成员XMLDocument来访问DOM。
  • 32. 在HTML网页中建立XML DOM对象的常用方式是, 首先创建一个MSXML所支持的DOMDocument对象实例, 然后再调用其load方法载入指定的XML文档,建立起DOM结构树与XML文档之间的关联。
  • 33. 7.3.2 显示单记录XML文档数据书中的DomDemo_01.htm文档,就是一个利用DOM对象编写简单脚本代码的HTML文档。在IE浏览器中运行这个网页文档,即可将范例文档Customer_single.xml中每个子元素的内容显示出来,如下图所示。
  • 34. 7.3.3 显示多记录XML文档数据书中的DomDemo_02.htm文档,就是一个利用DOM对象编写脚本程序来显示Customer.xml 中所有的记录数据的HTML文档。在该文档的脚本程序设计中利用了一种与XML文档中所包含元素数量无关的方法,因而可以显示所有的记录数据。
  • 35. 7.3.4 查询指定的XML元素数据书中的DomDemo_03.htm文档,就是一个利用Document对象的getElementsByTagName 方法,在Customer.xml文档中查询所有符合指定名称元素的例子。将此网页文档在IE浏览器中打开,在文本框中输入要查询的元素名称“联系人”后再按下“查询”按钮,即可显示出查询结果。
  • 36. 7.3.5 访问XML文档的属性值利用DOM编程的方式,同样可以实现访问XML文档中的属性。对于那些含有属性的XML元素只能使用该元素节点的attributes属性来访问其Attribute子节点。 书中的DomDemo_04.htm文档,就是用来显示范例文档Customer_Att.xml中每个“客户”元素含有的所有子元素的数据,同时显示出每个“联系人”子元素含有的两个属性(包括属性名称和属性值)。
  • 37. 7.3.6 测试XML文档的有效性书中的ValidityTest.htm文档,就是一个可用来检验任何XML文档有效性的脚本程序范例网页文档,这个网页会载入一个指定的XML文档,并使用DOMParseError对象所提供的属性来检测和报告载入XML文档时所发生的错误。 假设指定的XML文档是有效的、不存在格式错误运行上述检测程序网页后,将弹出“载入的XML文档是有效的!”的消息框。如果被检测的XML文档确实存在错误,就会弹出消息框,同时在其中详细地列出各项错误说明信息。
  • 38. 7.4 DOM服务器端编程访问XML7.4.1 ASP编程环境与DOM 1.建立ASP的运行环境 ASP是一种在服务器端运行的脚本程序,所以在开发和测试ASP网络应用程序之前,必须建立可供ASP程序运行的Web服务器工作环境。
  • 39. 因为ASP是Microsoft公司推出的,只有在Windows操作系统及其配套的Web服务器软件IIS支持下才能运行。 在成功安装IIS软件之后,再做一些简单的设置,就可以将自己的机器设定成一台虚拟的Web服务器。
  • 40. 2.在ASP编程中创建XML DOM使用JavaScript创建XML DOM对象实例,应使用如下代码之一: 使用VBScript创建XML DOM对象实例,应使用如下代码之一: 此外,加载XML文档时需要使用ASP提供的Server对象的MapPath方法将相对路径映射为网络路径。var xmldoc = Server.CreateObject("MSXML.DOMDocument"); var xmldoc = Server.CreateObject("Microsoft.XMLDOM");set xmldoc = Server.CreateObject("MSXML.DOMDocument") set xmldoc = Server.CreateObject("Microsoft.XMLDOM")
  • 41. 7.4.2 ASP编程创建XML文档可以利用DOM对象进行ASP编程来创建XML文档。具体步骤为: 1.调用Server对象的CreateObject方法创建一个Document对象实例。 2.调用Document对象的loadXML方法,将字符串形式的XML声明语句和文档根元素节点存入内存缓冲区中的DOM树。 3.在根元素下创建各个子元素节点。 4.为元素添加属性。 5.当所有的元素创建完毕后,调用Document对象实例的Save方法将内存中的DOM树内容存入指定的XML文档。
  • 42. 7.4.3 ASP编程遍历XML文档书中的ASP程序范例DomTraverse1.asp,是通过遍历DOM树的节点来访问和显示服务器端XML文档Customer.xml的所有元素数据。 该范例程序首先创建一个XML DOM对象实例,然后载入指定的Customer.xml文档。此后主要是通过创建一个递归函数traverse() 来实现遍历所有的DOM节点。函数代码中使用了当前节点的childNodes属性来获得一个NodeLists集合对象,并通过循环语句来逐个显示该集合中各个节点的文本内容。
  • 43. 小结DOM技术将XML文档映射为一颗节点树,其中每一个节点都是一个相应的编程对象(节点),每个不同的对象提供了各自的属性和方法。 XML DOM包含5个主要对象:DOMDocument,DOMNode, DOMNodeList, 等 利用各种XML DOM对象不仅可以编写客户端的HTML网页程序,还可以编写服务器端的网络应用程序,实现对服务器端XML文档的动态交互访问。
  • 44. DOM的优缺点DOM的优势表现在:易用性强,使用DOM时,将把所有的XML文档信息存于内存中,遍历简单,支持XPath,增强易用性。 DOM的缺点主要表现在:效率低,解析速度慢,内存占用量过高,对于大文件来说,几乎不可能使用。另外效率低还表现在大量的消耗时间,因为使用DOM进行解析时,将为文档的每个元素、属性、注释等都创建一个对象,这样在DOM机制中所运用的大量对象的创建和销毁会影响效率。