32、實現了NamedNodeMap接口的對象中包含了可以通過名字來訪問的一組節點的集合。
不過注意,NamedNodeMap並不是從NodeList繼承過來的,它所包含的節點集中的節點是無序的。盡管這些節點也可以通過索引來進行訪問,但這只是提供了枚舉NamedNodeMap中所包含節點的一種簡單方法,並不表明在DOM規范中為NamedNodeMap中的節點規定了一種排列順序。
NamedNodeMap表示的是一組節點和其唯一名字的一一對應關系,這個接口主要用在屬性節點的表示上。與NodeList相同,在DOM中,NamedNodeMap對象也是"live"的。
33、利用DOM,程序開發人員可以動態地創建文檔,遍歷文檔結構,添加、修改、刪除文檔內容等等。
我們將通過微軟的XML分析器msXML,對DOM接口的這些應用做的介紹。
使用不同的編程語言創建Document對象的范例。
JScript:
var doc = new ActiveXObject("Microsoft.XMLDOM")
VB Script:
Dim docSet doc = CreateObject("Microsoft.XMLDOM")
VB:
Dim doc As ObjectSet
doc = CreateObject("Microsoft.XMLDOM")
或者
Dim doc As DOMDocumentSet doc = New DOMDocument
VC:
HRESULT hr = CoCreateInstance
(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDocument(LPVOID*),&m_pXMLDocument);
34、Document的加載
不同的XML分析器所提供的加載XML文檔的方法也不盡相同。
在微軟的msxml中,提供了一個load方法來加載XML文檔,建立DOM樹同XML文檔之間的關聯。
依舊以聯系人列表信息的XML文檔.XML為例,可通過下述方式來加載文檔:
Dim myDocumentSet myDocument = CreateObject("microsoft.XMLdom")
myDocument.async = FalsemyDocument.load("clIEnt.XML")
35、對DOM樹的操作::
首先,我們要獲取XML文檔的根元素節點,用VBScript語言描述這個操作如下:
root = myDocument.documentElement
該語句的實際含義如下圖黃色箭頭所示。
在得到了文檔的根元素節點之後,我們又將如何訪問其他元素呢?以文檔中的第二個person元素為例,
對該元素節點以及其子節點的訪問可以通過下面的方式來實現:
personNode = root.childNodes.item(1)
nameNode = personNode.childNodes.item(0)
textNode = nameNode.childNodes.item(0)
theName = textNode.nodevalue
上述訪問語句執行後,theName的值是"李四"。下圖黃色箭頭給出了這一訪問過程的示意:
在上面的代碼中,root是文檔的根元素節點addressbook節點,personNode和nameNode都是元素類型的節點,textNode是TEXT類型的節點,theName是一個字符串。
childNodes是NodeList類型的屬性,item是NodeList接口中Node類型的屬性,通過item可以訪問NodeList節點集合中的任意節點(這兒有一點需要注意,當我們要訪問根元素節點addressbook的第二個person子節點personNode時,
我們用的索引參數是"1",這是因為item中的索引參數是從0開始的,如果我們要訪問節點集合中的第一個節點,則應該用item(0)來表示)。
在DOM規范中,要訪問元素節點的文本內容,需要先得到元素節點的TEXT子節點,再通過TEXT節點的屬性獲取文本內容。微軟在實現DOM接口時對DOM進行了部分擴展,可以通過元素類型節點的text屬性直接獲得元素中的文本內容。具體實用說明可以參考微軟msdn中的幫助。
上面的例子給出了如何訪問DOM樹中的元素節點,
對於DOM樹中的屬性節點,訪問方法略有不同,可以通過下面的語句來實現:
attr = node.attributes.getNamedItem("sex")
attrContent = attr.nodevalue
上述訪問語句執行後,attrContent的值是"male"。下圖用黃色箭頭標出了這一訪問的過程。
在上面的代碼中,attr是屬性類型的節點,attributes是NamedNodeMap類型的屬性,getNamedItem是NamedNodeMap接口中的方法。屬性的內容可以通過屬性節點的nodevalue來獲得。