使用Visual Basic操縱XML文檔
發(fā)表時間:2024-05-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]對于XML文檔,插入、修改、檢索等數(shù)據(jù)操作工作可以通過一個XML解析器及其列舉的一系列對象來完成。 Microsoft的XML解析器駐留在名為msxml.dll的動態(tài)鏈接庫文件中。因為msxml是一個COM對象,所以可以在任何兼容ActiveX的環(huán)境中使用它,如在VB和 ASP中。本文介紹在Vis...
對于XML文檔,插入、修改、檢索等數(shù)據(jù)操作工作可以通過一個XML解析器及其列舉的一系列對象來完成。 Microsoft的XML解析器駐留在名為msxml.dll的動態(tài)鏈接庫文件中。因為msxml是一個COM對象,所以可以在任何兼容ActiveX的環(huán)境中使用它,如在VB和 ASP中。本文介紹在Visual Basic中操縱XML文檔的具體方法。
裝載XML文檔
新建一個VB Standard EXE工程項目。在Form1中添加一個CommandButton控件,將其Name和Caption屬性分別設(shè)為cmdLoad和Load XML。為了使用msxml解析器,必須事先設(shè)置工程項目對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
運行該程序,點擊Load XML按鈕即可裝載XML文檔。載入的XML文檔包含一個按照樹狀結(jié)構(gòu)排列的節(jié)點對象集合,頂層節(jié)點或根節(jié)點是 documentElement。每個節(jié)點都有一組屬性和方法,每個節(jié)點可以包含一個或多個子節(jié)點,當(dāng)然也可以不包含任何節(jié)點。必須先取得對根節(jié)點的引用才能操縱XML文檔。在 cmdLoad_Click事件代碼后添加下列代碼:
Dim root As IXMLDOMElement
Set root = xml.documentElement
遍歷節(jié)點集合
可以使用Visual Basic的For Each...Next循環(huán)結(jié)構(gòu)在節(jié)點對象集合中循環(huán)。在cmdLoad_Click事件代碼后添加下列代碼:
Dim node As IXMLDOMNode
For Each node In root.childNodes
Debug.Print node.Text
Next
運行后點擊Load XML按鈕,將會在Immediate窗口中看到如下輸出結(jié)果:
2000年10月15日
北京 首都國際 香港 赤邋角 中國國際航空公司 波音公司
B747 13:00 15:55
上海 浦東 法蘭克福 美茵 塔什干 尤日內(nèi) 漢莎航空公司 空中客車工業(yè)公司
A330 21:45 01:45
注意,每個節(jié)點的Text屬性不僅包含自身的屬性值,還包含其下屬所有子節(jié)點的Text屬性值。一般情況下,不會同時操作所有的節(jié)點?梢允褂 selectNodes方法取得對一個特定的節(jié)點子集的引用,selectNodes方法返回一個 IXMLDOMNodeList對象。在cmdLoad_Click事件代碼后添加下列代碼:
Dim flightNodes As IXMLDOMNodeList
Set flightNodes = root.selectNodes(“航班")
For Each node In flightNodes
Debug.Print node.selectSingleNode
(“離站時間").Text & “——"
&node.selectSingleNode (“到站時間").Text
Next
這段代碼使用selectNodes方法選擇根節(jié)點下所有的“航班”節(jié)點,然后使用selectSingleNode方法選擇“航班”節(jié)點下的“離站時間”和“到站時間”,讀取并打印它們的Text屬性值。
可以使用childNodes集合以遞歸的方式層次化顯示XML 文檔的內(nèi)容。
首先,在Form1中聲明一個子過程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個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
運行程序。首先點擊Load XML按鈕加載flight.xml,然后點擊Print按鈕。在Immediate窗口中可以看到層次分明、易于閱讀的輸出結(jié)果。子過程 PrettyPrint在documentElement的子節(jié)點中循環(huán),打印每個節(jié)點的nodeName屬性值,而每個子節(jié)點又遞歸調(diào)用PrettyPrint。XML文檔內(nèi)各節(jié)點內(nèi)在的相似性是XML最具吸引力的特性,每個子節(jié)點都與其父節(jié)點有著相同的屬性和方法(盡管各自的內(nèi)容通常不同),這就使得為同一文檔中的所有或部分節(jié)點編寫某種規(guī)則變得相對簡單。
修改節(jié)點內(nèi)容
如同修改數(shù)據(jù)庫中的記錄一樣,也可以修改XML文檔中節(jié)點的內(nèi)容。下列代碼修改了flight.xml文檔中“發(fā)布日期”節(jié)點的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對象。Save方法的用法如下:
xml.save App.Path & “flightupdated.xml"
將上面兩段代碼添加在cmdLoad_Click事件中,運行程序。點擊Load XML按鈕,在程序工作目錄中會增加一個新文件flightupdated.xml。在IE5 中打開該文件,可以看到“發(fā)布日期”標(biāo)記的文本已經(jīng)被改為“2000年10月20日”。
在實際應(yīng)用中,XML可以被用作數(shù)據(jù)傳輸格式、可搜索數(shù)據(jù)庫、可定制的數(shù)據(jù)存儲方式和顯示信息的數(shù)據(jù)源(需要XSL或如VB這樣的編程語言的幫助)。因為msxml是一個COM對象,所以可以在ASP頁中使用它的實例,然后方便地使用VBScript或JScript編程來操縱它。