Html DOM樹(shù)的結(jié)構(gòu)和訪問(wèn)
你對(duì)Html DOM樹(shù)的概念是否了解,這里和大家分享一下,DOM(DocumentObjectModel)解析器將XML文檔一次性解析,生成一個(gè)位于內(nèi)存中的對(duì)象樹(shù)用以描述該文檔。
Html DOM樹(shù)
1.Html DOM樹(shù)
所有類型的XML解析器都要求處理對(duì)象是“格式良好”的XML文檔,有些還能根據(jù)DTD或XMLSchema進(jìn)行有效性驗(yàn)證,DOM(DocumentObjectModel)解析器將XML文檔一次性解析,生成一個(gè)位于內(nèi)存中的對(duì)象樹(shù)用以描述該文檔。
DOM是一種與平臺(tái)和語(yǔ)言無(wú)關(guān)的接口,它允許程序和腳本動(dòng)態(tài)訪問(wèn)和修改文檔的內(nèi)容、結(jié)構(gòu)和類型。它定義了一系列的對(duì)象和方法對(duì)Html DOM樹(shù)的節(jié)點(diǎn)進(jìn)行各種隨機(jī)操作:
◆Document對(duì)象:作為樹(shù)的最高節(jié)點(diǎn),Document對(duì)象是對(duì)整個(gè)文檔進(jìn)行操作的入口。
◆Element和Attr對(duì)象:這些節(jié)點(diǎn)對(duì)象都是文檔某一部分的映射,節(jié)點(diǎn)的定級(jí)層次恰好反映了文檔的結(jié)構(gòu)。
◆Text對(duì)象:作為Element和Attr對(duì)象的子節(jié)點(diǎn),Text對(duì)象表達(dá)了元素或?qū)傩缘奈谋緝?nèi)容。Text節(jié)點(diǎn)不再包含任何子節(jié)點(diǎn)。
◆集合索引:DOM提供了幾種集合索引方式,可以對(duì)節(jié)點(diǎn)按指定方式進(jìn)行遍歷。索引參數(shù)都是從0開(kāi)始記數(shù)的。
Html DOM樹(shù)中的所有節(jié)點(diǎn)都是從Node對(duì)象繼承而來(lái)的。Node對(duì)象定義了一些最基本的屬性和方法,利用這些方法可以實(shí)現(xiàn)對(duì)樹(shù)的遍歷,同時(shí),根據(jù)屬性還可以得知節(jié)點(diǎn)的名稱、取值并判斷其類型。
利用DOM,開(kāi)發(fā)人員可以動(dòng)態(tài)地創(chuàng)建XML、遍歷文檔、增加/刪除/修改文檔內(nèi)容。DOM提供的API與編程語(yǔ)言無(wú)關(guān),所以對(duì)一些DOM標(biāo)準(zhǔn)中沒(méi)有明確定義的接口,不同解析器的實(shí)現(xiàn)方法也可能有所差別。為方便描述,本文的舉例均采用MSXMLDOM方案并用VBScript編寫(xiě)代碼。
2.Html DOM樹(shù)的結(jié)構(gòu)
Document對(duì)象建立之后,就可以與XML文檔或數(shù)據(jù)島聯(lián)系在一起。數(shù)據(jù)島的加載方法是將數(shù)據(jù)島ID賦給Document對(duì)象:
- <XMLIDXMLID=“dsoDetails”src=“Books.xml”></XML>
- Setdoc=dsoDetails.XMLDocument
加載文檔大體上分為三步:
1.使用CreateObject方法創(chuàng)建分析器實(shí)例;
2.設(shè)置async屬性為False,禁止異步加載,這樣當(dāng)文檔加載完畢,控制權(quán)才會(huì)返回給調(diào)用進(jìn)程,如果想獲取文檔加載狀態(tài),可以讀取readyState屬性值;
3.使用load方法加載指定文檔。
- Setdoc=CreateObject(“Microsoft.XMLDOM”)
- doc.async=False
- doc.load“Books.xml”
XMLDOM還提供了一種loadXML的方法可以把XML字符串加載到Html DOM樹(shù)中,使用時(shí)只要把XML字符串直接作為該方法的參數(shù)即可。#p#
3.Html DOM樹(shù)的訪問(wèn)
在文檔加載完畢之后就可以使用documentElement屬性訪問(wèn)根元素:
- SetrootNode=doc.documentElement
一旦建立了對(duì)Html DOM樹(shù)中某個(gè)節(jié)點(diǎn)(例如根節(jié)點(diǎn))的引用,就可以根據(jù)節(jié)點(diǎn)間的等級(jí)關(guān)系調(diào)用適當(dāng)?shù)姆椒ㄟM(jìn)行遍歷。
下面以books.xml為例說(shuō)明各種方法的使用:
- <xmlidxmlid=“dsoBooks”>
- <?xmlversionxmlversion=“1.0”?><booklist><book>
- <title>TheGourmetMicrowave</title>
- <price>9.95</price>
- <author>CharlotteM.Cooper</author>
- <author>ShelleyB.Burke</author>
- <author>ReginaP.Murphy</author>
- </book><book>
- <title>Sushi,Anyone?</title>
- <price>14.99</price></book><book>
- <title>StraightTalkAboutComputers</title>
- <price>19.99</price>
- <author>LarsPeterson</author>
- </book></booklist></xml>
建立對(duì)第二個(gè)<book>元素的引用:
- SettheNode=dsoBooks.XMLDocument.
- documentElement.childNodes(1)
◆根節(jié)點(diǎn):theNode.ownerDocument返回Document節(jié)點(diǎn),指向XML文檔本身;
◆兄弟節(jié)點(diǎn):theNode.previousSibling返回第1個(gè)<book>元素,theNode.nextSibling返回第3個(gè)<book>元素;
◆父節(jié)點(diǎn):theNode.parentNode返回<booklist>元素;
◆子節(jié)點(diǎn):theNode.firstChild返回<title>元素,theNode.lastChild返回<price>元素,theNode.childNodes返回子節(jié)點(diǎn)集合,包括Sushi下面的所有元素。節(jié)點(diǎn)記數(shù)從0開(kāi)始,即theNode.childNodes(0)的結(jié)果與theNode.firstChild的結(jié)果是一樣的。
獲得節(jié)點(diǎn)的引用后,就可以讀取節(jié)點(diǎn)的相關(guān)信息:
◆節(jié)點(diǎn)類型:theNode.nodeType,本例為1,Document對(duì)象類型為9,元素類型為1,屬性類型為2;
◆節(jié)點(diǎn)名稱:theNode.nodeName,本例為book;
◆節(jié)點(diǎn)值:theNode.nodeValue,本例為null,對(duì)于Attr節(jié)點(diǎn),返回的是屬性值,而對(duì)于Element節(jié)點(diǎn),返回的是null。
在MSXML中,對(duì)Node對(duì)象還提供了一些額外的方法和屬性:
◆nodeTypeString:用字符串的方式顯示節(jié)點(diǎn)類型,如theNode.nodeTypeString的結(jié)果是“element”;
◆text:顯示當(dāng)前節(jié)點(diǎn)及其所有子節(jié)點(diǎn)的文本內(nèi)容;
◆xml:獲取XML文檔數(shù)據(jù),通常是從根元素開(kāi)始的所有內(nèi)容。#p#
4.XML格式的動(dòng)態(tài)轉(zhuǎn)換
通過(guò)學(xué)習(xí)XSL,我們已經(jīng)能夠使用樣式單對(duì)XML文檔進(jìn)行轉(zhuǎn)換。但這種過(guò)程是靜態(tài)的,即在編寫(xiě)代碼時(shí),已經(jīng)指定了作用在XML上的XSL文件,在程序運(yùn)行過(guò)程中不能再做改變。而利用DOM,我們能夠?qū)崿F(xiàn)XML格式的動(dòng)態(tài)轉(zhuǎn)換,即在程序運(yùn)行時(shí),將XSL載入并對(duì)XML文檔進(jìn)行轉(zhuǎn)換。
把XSL載入DOM對(duì)象的步驟基本上與XML文檔的載入過(guò)程是一樣的(XSL本身就是XML文檔):
- Setstylesheet=CreateObject(“Microsoft.XMLDOM”)
- stylesheet.async=False
- stylesheet.load“TransformDetails.xsl”
DOM提供了兩個(gè)函數(shù)進(jìn)行這種轉(zhuǎn)換,作用對(duì)象可以是樹(shù)中任何節(jié)點(diǎn)。這樣就可以實(shí)現(xiàn)對(duì)Html DOM樹(shù)的任意的部分進(jìn)行格式轉(zhuǎn)換。
◆transformNodeToObject方法:該方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)指向XSL文件,第二個(gè)參數(shù)存放轉(zhuǎn)換后的XML數(shù)據(jù)的節(jié)點(diǎn)。例如:
- SettargetNode=CreateObject(“Microsoft.XMLDOM”)
- srcNode.transformNodeToObjectstylesheet,targetNode
◆transformNode方法:該方法只需要一個(gè)參數(shù)指明XSL文件。如下例是將源節(jié)點(diǎn)轉(zhuǎn)換為一個(gè)字符串變量str:
- str=srcNode.transformNode(stylesheet)
【編輯推薦】