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: ” & _ docCustomers.selectNodes(“//customer”).length