GB | BIG5
|
| 首頁 > 編程技術 > XML/WML > 正文 |
 |
| XML技術系列講座(8)通過DOM操作數據(下) |
| 本文出自:http://www.computerworld.com.cn 作者: 北京郵電大學 張劍 (2002-02-10 07:20:01) |
|
DOM在解析XML文檔的時候可能會產生各式各樣的錯誤,可以根據ParseError對象中的屬性得知出錯的可能原因及相關信息。 |
|
屬性 |
說明 |
|
errorCode |
錯誤代碼 |
|
filepos |
錯誤在文檔中的絕對字符位置 |
|
line |
錯誤所在行的行號 |
|
linepos |
錯誤所在行的字符位置 |
|
reason |
錯誤產生原因 |
|
srcText |
錯誤所在行的源代碼 |
|
url |
最近一份含有解析錯誤的XML文檔的URL地址 |
|
|
DOM還提供了許多查找節點的方法。其中基搜索機制的方法有: |
|
以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節點下,作為它的子節點; |
|
● 把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操作。 |
|
從以上的介紹中可以看出,由節點間的繼承關系,以及各種類型節點本身提供的豐富的接口,用戶可以很容易地找到一套適合自己需要的對象操作方案。 |
|
DOM技術還可以用來顯示XML數據。XSL樣式單面向的是XML文檔的轉換,用顯示格式的轉換是其應用的一個方面,所以在顯示功能上還存在著一些不足: |
|
● 不易完成對XML數據的復雜處理,如將英文字母全部轉換為大寫,截取指定長度的字符串,忽略一些特定的標點等; |
|
● 一個XSL通常是靜態地作用到一個XML文檔上,無法將多個XML文檔中的數據用一個XSL合並轉換為一個輸出結果。 |
|
使用DOM就能夠很好地解決上述問題,而且編寫的腳本在服務器端和客戶端都能夠執行。在客戶端可以根據情況創建友好的用戶界面與用戶進行交互,在服務器端使用腳本利用DOM可以按客戶端的需求將數據進行組織並且發送。 |
|
下面的這個例子就是把XML文檔轉換成HTML中的表格: |
|
outstr = “<TABLE BORDER=1>” |
|
Set listOrderitem = doc.selectNodes(“//orderitem”) |
|
For Each node In listOrderitem |
|
outstr = outstr & “<TR>” & _ |
|
“<TD>” & node.getAttribute(“title”) & _ |
|
“<TD>” & node.getAttribute(“isbn”) & _ |
|
outstr = outstr & “</TABLE>” |
|
下面的這個例子則是對XML數據進行數值運算,計算書本的平均售價: |
|
Set listPrice = doc.selectNodes(“//price”) |
|
For Each node In listPrice |
|
totalPrice = totalPrice + node.firstChild.nodeValue |
|
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: ” & _ |
|
 |
★ 樊強制作 歡迎分享 ★ |
|