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