明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用Visual Basic操縱XML文檔

[摘要]對(duì)于XML文檔,插入、修改、檢索等數(shù)據(jù)操作工作可以通過一個(gè)XML解析器及其列舉的一系列對(duì)象來完成。 Microsoft的XML解析器駐留在名為msxml.dll的動(dòng)態(tài)鏈接庫文件中。因?yàn)閙sxml是一個(gè)COM對(duì)象,所以可以在任何兼容ActiveX的環(huán)境中使用它,如在VB和 ASP中。本文介紹在Vis...
對(duì)于XML文檔,插入、修改、檢索等數(shù)據(jù)操作工作可以通過一個(gè)XML解析器及其列舉的一系列對(duì)象來完成。 Microsoft的XML解析器駐留在名為msxml.dll的動(dòng)態(tài)鏈接庫文件中。因?yàn)閙sxml是一個(gè)COM對(duì)象,所以可以在任何兼容ActiveX的環(huán)境中使用它,如在VB和 ASP中。本文介紹在Visual Basic中操縱XML文檔的具體方法。  

裝載XML文檔  
新建一個(gè)VB Standard EXE工程項(xiàng)目。在Form1中添加一個(gè)CommandButton控件,將其Name和Caption屬性分別設(shè)為cmdLoad和Load XML。為了使用msxml解析器,必須事先設(shè)置工程項(xiàng)目對(duì)msxml.dll的引用。選擇Project菜單的 References命令,選中Microsoft XML, version 2.0或更高版本。將下列代碼加入 cmdLoad_Click事件:  
Option Explicit
Dim xml As DOMDocument
Private Sub cmdLoad_Click()
Set xml = New DOMDocument
Call xml.Load(App.Path & “flight.xml")
' flight.xml為描述航班信息的XML文檔
End Sub

運(yùn)行該程序,點(diǎn)擊Load XML按鈕即可裝載XML文檔。載入的XML文檔包含一個(gè)按照樹狀結(jié)構(gòu)排列的節(jié)點(diǎn)對(duì)象集合,頂層節(jié)點(diǎn)或根節(jié)點(diǎn)是 documentElement。每個(gè)節(jié)點(diǎn)都有一組屬性和方法,每個(gè)節(jié)點(diǎn)可以包含一個(gè)或多個(gè)子節(jié)點(diǎn),當(dāng)然也可以不包含任何節(jié)點(diǎn)。必須先取得對(duì)根節(jié)點(diǎn)的引用才能操縱XML文檔。在 cmdLoad_Click事件代碼后添加下列代碼:  

Dim root As IXMLDOMElement
Set root = xml.documentElement

遍歷節(jié)點(diǎn)集合  
可以使用Visual Basic的For Each...Next循環(huán)結(jié)構(gòu)在節(jié)點(diǎn)對(duì)象集合中循環(huán)。在cmdLoad_Click事件代碼后添加下列代碼:  
Dim node As IXMLDOMNode
For Each node In root.childNodes
Debug.Print node.Text
Next

運(yùn)行后點(diǎn)擊Load XML按鈕,將會(huì)在Immediate窗口中看到如下輸出結(jié)果:  

2000年10月15日  
北京 首都國際 香港 赤邋角 中國國際航空公司 波音公司  
B747 13:00 15:55  
上海 浦東 法蘭克福 美茵 塔什干 尤日內(nèi) 漢莎航空公司 空中客車工業(yè)公司  
A330 21:45 01:45  

注意,每個(gè)節(jié)點(diǎn)的Text屬性不僅包含自身的屬性值,還包含其下屬所有子節(jié)點(diǎn)的Text屬性值。一般情況下,不會(huì)同時(shí)操作所有的節(jié)點(diǎn)。可以使用 selectNodes方法取得對(duì)一個(gè)特定的節(jié)點(diǎn)子集的引用,selectNodes方法返回一個(gè) IXMLDOMNodeList對(duì)象。在cmdLoad_Click事件代碼后添加下列代碼:  

Dim flightNodes As IXMLDOMNodeList
Set flightNodes = root.selectNodes(“航班")
For Each node In flightNodes
Debug.Print node.selectSingleNode
(“離站時(shí)間").Text & “——"  
&node.selectSingleNode (“到站時(shí)間").Text
Next

這段代碼使用selectNodes方法選擇根節(jié)點(diǎn)下所有的“航班”節(jié)點(diǎn),然后使用selectSingleNode方法選擇“航班”節(jié)點(diǎn)下的“離站時(shí)間”和“到站時(shí)間”,讀取并打印它們的Text屬性值。  

可以使用childNodes集合以遞歸的方式層次化顯示XML 文檔的內(nèi)容。  

首先,在Form1中聲明一個(gè)子過程PrettyPrint。  

Public Sub PrettyPrint(node As IXMLDOMNode,
Optional tabLevel As Integer=0)
Dim childNode As IXMLDOMNode
If node.nodeName<>vbNullStrin  
And node.nodeName < >“#text" Then
Debug.PrintString(tabLevel,Chr$(9))
&“< "&node.nodeName&“ >"
End If
If node.hasChildNodes Then
For Each childNode In node.childNodes
Call PrettyPrint(childNode,tabLevel+1)
Next
Else
Debug.PrintString(tabLevel+1,Chr$(9))&node.Text
End If
If node.nodeName< >vbNullString And node.nodeName
< >“#text" Then
Debug.PrintString
(tabLevel,Chr$(9))&“< /"&node.nodeName&“ >"
End If
End Sub

然后在Form1中加入第2個(gè)CommandButton控件,將其 Name和Caption屬性分別設(shè)為cmdPrint和Print。將下列代碼加入事件cmdPrint_Click中:  

Private Sub cmdPrint_Click()
If Not xml Is Nothing Then
Call PrettyPrint
(xml.documentElement)
End If
End Sub

運(yùn)行程序。首先點(diǎn)擊Load XML按鈕加載flight.xml,然后點(diǎn)擊Print按鈕。在Immediate窗口中可以看到層次分明、易于閱讀的輸出結(jié)果。子過程 PrettyPrint在documentElement的子節(jié)點(diǎn)中循環(huán),打印每個(gè)節(jié)點(diǎn)的nodeName屬性值,而每個(gè)子節(jié)點(diǎn)又遞歸調(diào)用PrettyPrint。XML文檔內(nèi)各節(jié)點(diǎn)內(nèi)在的相似性是XML最具吸引力的特性,每個(gè)子節(jié)點(diǎn)都與其父節(jié)點(diǎn)有著相同的屬性和方法(盡管各自的內(nèi)容通常不同),這就使得為同一文檔中的所有或部分節(jié)點(diǎn)編寫某種規(guī)則變得相對(duì)簡(jiǎn)單。  

修改節(jié)點(diǎn)內(nèi)容  
如同修改數(shù)據(jù)庫中的記錄一樣,也可以修改XML文檔中節(jié)點(diǎn)的內(nèi)容。下列代碼修改了flight.xml文檔中“發(fā)布日期”節(jié)點(diǎn)的Text屬性值:  
Set node = root.selectSingleNode(“發(fā)布日期")
If Not node Is Nothing Then
node.Text = “2000年10月20日"
End If

修改了文檔內(nèi)容之后,可以使用Save方法保存修改后的文檔。Save方法可以將XML文檔保存為文件、數(shù)據(jù)流或ASP的Response對(duì)象。Save方法的用法如下:  

xml.save App.Path & “flightupdated.xml"

將上面兩段代碼添加在cmdLoad_Click事件中,運(yùn)行程序。點(diǎn)擊Load XML按鈕,在程序工作目錄中會(huì)增加一個(gè)新文件flightupdated.xml。在IE5 中打開該文件,可以看到“發(fā)布日期”標(biāo)記的文本已經(jīng)被改為“2000年10月20日”。  

在實(shí)際應(yīng)用中,XML可以被用作數(shù)據(jù)傳輸格式、可搜索數(shù)據(jù)庫、可定制的數(shù)據(jù)存儲(chǔ)方式和顯示信息的數(shù)據(jù)源(需要XSL或如VB這樣的編程語言的幫助)。因?yàn)閙sxml是一個(gè)COM對(duì)象,所以可以在ASP頁中使用它的實(shí)例,然后方便地使用VBScript或JScript編程來操縱它。