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

首頁 > 編程技術 > XML/WML > 正文
XML技術系列講座(8)通過DOM操作數據(下)
本文出自:http://www.computerworld.com.cn 作者: 北京郵電大學 張劍 (2002-02-10 07:20:01)
1、DOM解析時的錯誤
DOM在解析XML文檔的時候可能會產生各式各樣的錯誤,可以根據ParseError對象中的屬性得知出錯的可能原因及相關信息。
常用的屬性及其含義如下表所示:
屬性 說明
errorCode 錯誤代碼
filepos 錯誤在文檔中的絕對字符位置
line 錯誤所在行的行號
linepos 錯誤所在行的字符位置
reason 錯誤產生原因
srcText 錯誤所在行的源代碼
url 最近一份含有解析錯誤的XML文檔的URL地址
2、訪問DOM樹中的元素與屬性
DOM還提供了許多查找節點的方法。其中基搜索機制的方法有:
● 根據標簽名稱搜索元素;
● 使用XSL模式搜索節點;
● 利用集合索引搜索節點。
以books.xml為例,Document對象中的getElementsByTagName方法就是根據參數中的標簽名稱在全文范圍內查找元素的,返回值是一個NodeList對象:
Set doc = dsoDetails.XMLDocument
Set authors = doc.getElementsByTagName(“author”)
上述查詢結果中包含了文檔中出現的全部4位作者。如果調用的是Element對象中的getElementsByTagName方法,除了搜索范圍縮小為該元素的所有繼節點之外,其他的情況都是一樣的。
所有類型的節點都帶有selectNodes方法,該方法的唯一參數是XSL的模式規則,返回值是匹配該規則的結果集合。調用這個方法可以利用XSL的模式匹配策略查找節點。例如:
Set rootNode = doc.documentElement
Set cheapbooks = rootNode.selectNodes(“//book[price < 10]”)
這個例子返回所有售價低10元的<book>元素。另外,節點中的selectSingleNodes方法的用法與selectNodes是一樣的,只是返回結果為查找到的滿足條件的第一個節點而已。
對元素節點,獲取元素標簽名稱的方法有兩種:anyElement.nodeName和anyElement.tagName。前者是Node對象的屬性,者是Element對象的屬性。
如果想獲取元素中的文本內容,如: <price>9.95
</price>時,訪問Element對象中的nodeValue屬性是錯誤的,這時返回結果是null,而不是預期的9.95。含有文本內容的元素都包含一個Text類型的子節點,所以只有通過Text對象中的nodeValue屬性才能真正訪問到文本內容。
添加元素的步驟如下:
● 創建一個Text節點並賦值;
● 創建Element節點;
● 把Text節點掛在Element節點下,作為它的子節點;
● 把Element節點插入到XML文檔的合適位置上。
對元素節點的刪除和替換操作,首先都要對操作對象進行定位,然相應地執行對象節點所屬父節點的removeChild方法和replaceChild方法即可。
Attr節點的各種操作在原理上與Element節點相同。Attr對象同樣繼承了Node對象中的各種方法和屬性,並且MSXML中還提供了name屬性和value屬性,能夠更直接地訪問到屬性信息。另外,還可以通過屬性所屬元素的相關方法訪問屬性,如通過getAttribute和setAttribute方法讀取屬性值或修改屬性值,或者用getAttributeNode方法直接返回Attr對象。
創建新屬性最直接的辦法就是使用Element對象中的setAttribute方法。也可以先用Document對象中的createAttribute方法設置屬性值,然使用Element對象中的setAttributeNode方法把新節點添加到DOM樹中。同樣地,刪除屬性最直接的方法是調用Element中的removeAttribute方法。另外一種方案是先用getAttributeNode方法對操作對象進行定位,然執行removeAttributeNode操作。
從以上的介紹中可以看出,由節點間的繼承關系,以及各種類型節點本身提供的豐富的接口,用戶可以很容易地找到一套適合自己需要的對象操作方案。
3、DOM的顯示功能
DOM技術還可以用來顯示XML數據。XSL樣式單面向的是XML文檔的轉換,用顯示格式的轉換是其應用的一個方面,所以在顯示功能上還存在著一些不足:
● 不易完成對XML數據的復雜處理,如將英文字母全部轉換為大寫,截取指定長度的字符串,忽略一些特定的標點等;
● 不易對XML數據中的數值進行計算;
● 一個XSL通常是靜態地作用到一個XML文檔上,無法將多個XML文檔中的數據用一個XSL合並轉換為一個輸出結果。
使用DOM就能夠很好地解決上述問題,而且編寫的腳本在服務器端和客戶端都能夠執行。在客戶端可以根據情況創建友好的用戶界面與用戶進行交互,在服務器端使用腳本利用DOM可以按客戶端的需求將數據進行組織並且發送。
下面的這個例子就是把XML文檔轉換成HTML中的表格:
Dim outstr
outstr = “<TABLE BORDER=1>”
Set listOrderitem = doc.selectNodes(“//orderitem”)
For Each node In listOrderitem
outstr = outstr & “<TR>” & _
“<TD>” & node.getAttribute(“title”) & _
“</TD>” & _
“<TD>” & node.getAttribute(“isbn”) & _
“</TD></TR>”
Next
outstr = outstr & “</TABLE>”
下面的這個例子則是對XML數據進行數值運算,計算書本的平均售價:
totalPrice = 0
Set listPrice = doc.selectNodes(“//price”)
For Each node In listPrice
totalPrice = totalPrice + node.firstChild.nodeValue
Next
avgPrice = totalPrice / listPrice.length
最的這個例子顯示了DOM 把多個XML文檔合並轉換顯示的強大功能:
<XML ID=“dsoOrders” src=“Orders.xml”></XML>
<XML ID=“dsoCustomers” src=“Customers.xml”></XML>
Set docOrders = dsoOrders.XMLDocument
Set docCustomers = dsoCustomers.XMLDocument
outstr = “<P>Number of order items: ” & _
docOrders.selectNodes(“//orderitem”).length & _
“<P>Number of customers: ” & _

(http://www.fanqiang.com)     進入【UNIX論壇
docCustomers.selectNodes(“//customer”).length

相關文章
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)

===更多相關===
 

★  樊強制作 歡迎分享  ★