[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > XML/WML > 正文
XML技術系列講座(7)通過DOM操作數據(上)
本文出自:http://www.computerworld.com.cn 作者: 北京郵電大學 張劍 (2002-02-09 07:20:00)
1、DOM樹
所有類型的XML解析器都要求處理對象是“格式良好”的XML文檔,有些還能根據DTD或XML Schema進行有效性驗証,DOM(Document Object Model)解析器將XML文檔一次性解析,生成一個位內存中的對象樹用以描述該文檔。
DOM是一種與平台和語言無關的接口,它允許程序和腳本動態訪問和修改文檔的內容、結構和類型。它定義了一系列的對象和方法對DOM樹的節點進行各種隨機操作:
● Document對象:作為樹的最高節點,Document對象是對整個文檔進行操作的入口。
● Element和Attr對象:這些節點對象都是文檔某一部分的映射,節點的定級層次恰好反映了文檔的結構。
● Text對象:作為Element和Attr對象的子節點,Text對象表達了元素或屬性的文本內容。Text節點不再包含任何子節點。
● 集合索引:DOM提供了幾種集合索引方式,可以對節點按指定方式進行遍歷。索引參數都是從0開始記數的。
DOM樹中的所有節點都是從Node對象繼承而來的。Node對象定義了一些最基本的屬性和方法,利用這些方法可以實現對樹的遍歷,同時,根據屬性還可以得知節點的名稱、取值並判斷其類型。
利用DOM,開發人員可以動態地創建XML、遍歷文檔、增加/刪除/修改文檔內容。DOM提供的API與編程語言無關,所以對一些DOM標準中沒有明確定義的接口,不同解析器的實現方法也可能有所差別。為方便描述,本文的舉例均採用MSXML DOM方案並用VB Script編寫代碼。
2、DOM樹的結構
Document對象建立之,就可以與XML文檔或數據島聯系在一起。數據島的加載方法是將數據島ID賦給Document對象:
<XML ID=“dsoDetails” src=“Books.xml”></XML>
Set doc = dsoDetails.XMLDocument
加載文檔大體上分為三步:
1.使用CreateObject方法創建分析器實例;
2.設置async屬性為False,禁止異步加載,這樣當文檔加載完畢,控制權才會返回給調用進程,如果想獲取文檔加載狀態,可以讀取readyState屬性值;
3.使用load方法加載指定文檔。
Set doc = CreateObject(“Microsoft.XMLDOM”)
doc.async = False
doc.load “Books.xml”
XML DOM還提供了一種loadXML的方法可以把XML字符串加載到DOM樹中,使用時只要把XML字符串直接作為該方法的參數即可。
3、DOM樹的訪問
在文檔加載完畢之就可以使用documentElement屬性訪問根元素:
Set rootNode = doc.documentElement
一旦建立了對DOM樹中某個節點(例如根節點)的引用,就可以根據節點間的等級關系調用適當的方法進行遍歷。
下面以books.xml為例說明各種方法的使用:
<xml id=“dsoBooks”>
<?xml version=“1.0”?><booklist><book>
<title>The Gourmet Microwave</title>
<price>9.95</price>
<author>Charlotte M. Cooper</author>
<author>Shelley B. Burke</author>
<author>Regina P. Murphy</author>
</book><book>
<title>Sushi, Anyone?</title>
<price>14.99</price></book><book>
<title>Straight Talk About Computers</title> <price>19.99</price>
<author>Lars Peterson</author>
</book></booklist></xml>
建立對第二個<book>元素的引用:
Set theNode =dsoBooks.XMLDocument.documentElement.childNodes(1)
● 根節點:theNode.ownerDocument返回Document節點,指向XML文檔本身;
● 兄弟節點:theNode.previousSibling返回第1個<book>元素,theNode.nextSibling返回第3個<book>元素;
● 父節點:theNode.parentNode返回<booklist>元素;
● 子節點:theNode.firstChild返回<title>元素,theNode.lastChild返回<price>元素,theNode.childNodes返回子節點集合,包括Sushi下面的所有元素。節點記數從0開始,即theNode.childNodes(0)的結果與theNode.firstChild的結果是一樣的。
獲得節點的引用,就可以讀取節點的相關信息:
● 節點類型:theNode.nodeType,本例為1,Document對象類型為9,元素類型為1,屬性類型為2;
● 節點名稱:theNode.nodeName,本例為book;
● 節點值:theNode.nodeValue,本例為null,對Attr節點,返回的是屬性值,而對Element節點,返回的是null。
在MSXML中,對Node對象還提供了一些額外的方法和屬性:
● nodeTypeString:用字符串的方式顯示節點類型,如theNode.nodeTypeString的結果是“element”;
● text: 顯示當前節點及其所有子節點的文本內容;
● xml:獲取XML文檔數據,通常是從根元素開始的所有內容。
4、XML格式的動態轉換
通過學習XSL,我們已經能夠使用樣式單對XML文檔進行轉換。但這種過程是靜態的,即在編寫代碼時,已經指定了作用在XML上的XSL文件,在程序運行過程中不能再做改變。而利用DOM,我們能夠實現XML格式的動態轉換,即在程序運行時,將XSL載入並對XML文檔進行轉換。
把XSL載入DOM對象的步驟基本上與XML文檔的載入過程是一樣的(XSL本身就是XML文檔):
Set stylesheet = CreateObject(“Microsoft.XMLDOM”)
stylesheet.async = False
stylesheet.load “TransformDetails.xsl”
DOM提供了兩個函數進行這種轉換,作用對象可以是樹中任何節點。這樣就可以實現對DOM樹的任意的部分進行格式轉換。
● transformNodeToObject方法:該方法需要兩個參數,第一個參數指向XSL文件,第二個參數存放轉換的XML數據的節點。例如:
Set targetNode = CreateObject(“Microsoft.XMLDOM”)
srcNode.transformNodeToObject stylesheet, targetNode
● transformNode方法:該方法只需要一個參數指明XSL文件。如下例是將源節點轉換為一個字符串變量str:
str = srcNode.transformNode(stylesheet)

(http://www.fanqiang.com)     進入【UNIX論壇
上面介紹的方法在服務器上一樣可以實現,而且更具實際意義:服務器可以根據客戶端的不同身份,使用不同的樣式單進行轉換,同一份XML文檔呈現在不同用戶面前的形式是不一樣的!

相關文章
XML技術系列講座(13)XML與電子商務 (2002-02-13 06:15:00)
XML技術系列講座(12)驗証XML數據合法性(下) (2002-02-12 07:15:00)
XML技術系列講座(11)驗証XLM數據合法性(上) (2002-02-12 06:15:00)
XML技術系列講座(10)客戶機與服務器的數據交互(下) (2002-02-11 07:15:00)
XML技術系列講座(9)客戶機與服務器的數據交互(上) (2002-02-11 06:15:00)
XML技術系列講座(8)通過DOM操作數據(下) (2002-02-10 07:20:01)
XML技術系列講座(7)通過DOM操作數據(上) (2002-02-09 07:20:00)
XML技術系列講座(6)XML與HTML的結合(下) (2002-02-08 07:15:00)
XML技術系列講座(5)XML與HTML的結合(上) (2002-02-08 06:15:00)
XML技術系列講座(4)XML的顯示XSL樣式單(下) (2002-02-07 07:15:01)

===更多相關===
 

★  樊強制作 歡迎分享  ★