2019/12/191第5章XML文档对象模型理解文档对象模型的概念熟悉文档对象模型的基本知识掌握客户端加载XML的方法掌握服务器端加载XML的方法学会用DOM编制JavaScript程序2019/12/1921DOM的基本概念DOM(DocumentObjectModel,文档对象模型)定义了访问诸如XML和XHTML文档的标准,是W3C(万维网联盟)推荐的标准。DOM是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的与平台和语言中立的接口。它定义了所有文档元素的对象和属性,以及访问它们的方法。DOM由三部分组成:核心DOM:用于任何结构化文档的标准模型HTMLDOM:用于HTML文档的标准模型XMLDOM:用于XML文档的标准模型HTMLDOM:定义了所有HTML元素的对象和属性,以及访问它们的方法XMLDOM:定义了所有XML元素的对象和属性,以及访问它们的方法。2019/12/1932XMLDOM节点在XMLDOM中XML文档的每个成分都是一个节点:整个文档是一个文档节点每个XML标签是一个元素节点包含在XML元素中的文本是文本节点每一个XML属性是一个属性节点注释属于注释节点特别注意:元素节点不包含文本,元素节点的文本是存储在文本节点中的。2019/12/194?xmlversion=1.0encoding=ISO-8859-1?bookstorebookcategory=CHILDRENtitlelang=enHarryPotter/titleauthorJK.Rowling/authoryear2005/yearprice29.99/price/bookbookcategory=COOKINGtitlelang=enEverydayItalian/titleauthorGiadaDeLaurentiis/authoryear2005/yearprice30.00/price/bookbookcategory=WEBtitlelang=enXQueryKickStart/titleauthorJamesMcGovern/authorauthorPerBothner/authorauthorKurtCagle/authorauthorJamesLinn/authorauthorVaidyanathanNagarajan/authoryear2003/yearprice49.99/price/book/bookstore◆根节点bookstore拥有四个book子节点。◆第一个book节点拥有四个子节点:titleauthoryearprice◆上面每个节点都包含一个文本节点HarryPotterJK.Rowling“2005”29.99“◆注意:元素节点year,拥有一个值为“2005”的文本节点。2005不是year元素的值!2019/12/1953XMLDOM节点树XMLDOM把XML文档视为一棵节点树。可通过这棵树访问所有节点,修改、删除、创建节点。树中的所有节点彼此之间都有关系。2019/12/1963.1XMLDOM节点间的关系父、子和同胞节点用于描述节点间关系在节点树中,顶端的节点成为根节点根节点之外的每个节点都有一个父节点节点可以有任何数量的子节点叶子是没有子节点的节点同胞节点是拥有相同的父节点2019/12/1974XMLDOM解析大多数浏览器都内建了供读取和操作XML的XML解析器。解析器把XML读入内存,并把它转换为可被脚本语言访问的XMLDOM对象。所有的解析器都含有遍历XML树、访问、插入及删除节点的函数。2019/12/1984.1解析器加载XML文档在访问、处理XML文档之前,必须把它载入XMLDOM对象。根据浏览器的不同,加载的方法也稍有不同。//在IE(IE5及更高版本)中创建空的XML文档对象varxmlDoc=newActiveXObject(Microsoft.XMLDOM);//关闭异步加载,确保在文档完整加载之前,解析器不会继续执行脚本xmlDoc.async=false;//加载名为books.xml的文档xmlDoc.load(books.xml);//在Fireforx,Mozilla,Opera中创建空的XML文档对象varxmlDoc=document.implementation.createDocument(,,null);//关闭异步加载,确保在文档完整加载之前,解析器不会继续执行脚本xmlDoc.async=false;//加载名为books.xml的文档xmlDoc.load(books.xml);2019/12/199DomImplementation对象该对象可执行与文档对象模型的任何与实例无关的操作。可以通过Document对象的implementation属性获得对DomImplementation对象的引用。在Firefox,Mozilla,Opera等浏览器中用该对象的createDocument()方法创建一个新XMLDOM对象。语法:createDocument(namespaceURI,qualifiedName,doctype)namespaceURI:指定根元素的名称空间。qualifiedName:指定名称空间前缀。Doctype:创建XMLDOM对象的DTD对象。2019/12/19104.2通用XML文档加载函数functionloadXMLDoc(dname){varxmlDoc=null;try{//InternetExplorerxmlDoc=newActiveXObject(Microsoft.XMLDOM)}catch(e){try{//Firefox,Mozilla,Opera,etc.xmlDoc=document.implementation.createDocument(,,null)}catch(e){alert(e.message)}}try{xmlDoc.async=false;xmlDoc.load(dname);return(xmlDoc);}catch(e){alert(e.message)}return(xmlDoc);}为了避免重复编写代码,可以编写一个跨浏览器的通用的XML文档加载函数备用:2019/12/19114.3获取解析器错误信息在打开一个XML文档时,可能会发生解析器错误。通过parseError对象,可取回错误代码、错误原因和引起错误的行等等。parseError对象的主要属性:errorCode:返回一个长整型错误码,0表示无错。reason:返回包含错误原因的字符串。line:返回表示错误行号的长整型数。2019/12/1912获取错误信息的例子xmlDom=loadXMLDoc(error.xml);if(xmlDom.parseError.errorCode!=0){document.write(br错误代码:);document.write(xmlDom.parseError.errorCode);document.write(br错误原因:);document.write(xmlDom.parseError.reason);document.write(br错误行号:);document.write(xmlDom.parseError.line)}2019/12/19135XMLDOM对象的属性和方法属性和方法为XMLDOM定义了编程的接口。XMLDOM的documentElement属性是根节点。XMLDOM节点的主要属性(x为任意的节点对象):x.nodeName:x的名称;x.nodeValue:x的值;x.parentNode:x的父节点;x.childNodes:x的子节点列表;x.attributes:x的属性节点列表;XMLDOM节点的主要方法:x.getElementsByTagName(name):获取以x为根的子树中带有指定标签名称的所有元素,返回值为节点列表;x.appendChild(node):向x插入子节点;x.removeChild(node):从x删除子节点;2019/12/1914getElementsByTagName()返回拥有指定标签名的所有元素的列表(可以看成数组)。语法:node.getElementsByTagName(tagname);例:x.getElementsByTagName(title);仅返回x节点下的所有title元素。例:xmlDoc.getElementsByTagName(title);返回XML文档中的所有title元素的列表。5.1GetElementsByTagName2019/12/19155.2节点列表对象NodeList当使用getElementsByTagName()方法时,会返回NodeList对象。NodeList对象表示节点的列表,以XML中的相同顺序排列。使用从0开始的下标来访问节点列表中的节点。xmlDoc=loadXMLDoc(books.xml);x=xmlDoc.getElementsByTagName(title);txt=x[0].childNodes[0].nodeValue;2019/12/19165.3NodeList的length属性NodeList对象会保持自身的更新。如果删除或添加了元素,列表会自动更新调整。节点列表的length属性是列表中节点的数目。下例是使用length属性来遍历title元素的列表:xmlDoc=loadXMLDoc(books.xml);//变量x存放节点列表x=xmlDoc.getElementsByTagName('title');for(i=0;ix.length;i++){document.write(x[i].childNodes[0].nodeValue);document.write(br/);}2019/12/19175.4XMLDOM的根节点documentElementXML文档对象的documentElement属性是根节点。遍历根节点的子节点的代码如下:xmlDoc=loadXMLDoc(books.xml);x=xmlDoc.documentElement.childNodes;//输出每子节点的名称for(i=0;ix.length;i++){document.write(x[i].nodeName);document.write(br/);}2019/12/19186XMLDOM节点信息节点属性:nodeName、nodeValue以及nodeTypenodeName属性nodeName属性规定节点的名称。nodeName是只读的元素节点的nodeName与标签名相同属性节点的nodeName是属性的名称文本节点的nodeName永远是#text文档节点的nodeName永远是#document2019/12/19196.1nodeValue属性nodeValue属性nodeValue属性规定节点的值。元素节点的nodeValue是undefined文本节点的nodeValue是文本自身属性节点的nodeValue是属性的值获取元素的值x=xmlDoc.getElementsByTagName(title)[0].childNodes[0];txt=x.nodeValue;更改元素的值x=xmlDoc.getElementsByTagName(title)[0].ch