XML DOM 入門指南

XML DOM 入門指南

Brian Randell
DevelopMentor
1999 年 10 月

摘要:本文討論當 XML 文檔被 Microsoft(R) XML Parser 顯露之後,如何通過執行 XML DOM 來訪問和操作 XML 文檔。(共 10 頁)

目錄

前言
DOM 的確切定義是什麼?
如何使用 XML Dom?
如何加載文檔?
處理故障
在 XML 文檔中檢索信息
如何在文檔中來回移動?
現在做什麼?

前言

假如您是 Visual Basic(R) 開發人員,您收到一些“可擴展的標記語言 (XML)” 文檔格式的數據。此時您一定希望得到 XML 文檔中的信息,並將這些數據結合到 Visual Basic 的解決方案中。您必然會自己編寫代碼來分析 XML 文件的內容,該文件不過是個文本文件而已。但這決不是多快好省的辦法,而且抹煞了 XML 的優點:表現數據的結構化方法。

檢索 XML 文件中的信息的較好方法是使用 XML 分析程序。十分簡單,XML 分析程序是個軟件,它讀 XML 文件並使其中的數據成爲可用的。作爲 Visual Basic 的開發人員,希望使用支持 XML“文檔對象模型 (DOM)”的分析程序。DOM 定義了分析程序應當顯露的標準命令集,使您能夠在程序中訪問 HTML 和 XML 文檔內容。支持 DOM 的 XML 分析程序取出 XML 文檔中的數據,並通過一組可以對它編程的對象來顯露它。在這篇文章中,您將學會當 XML 文檔被 Microsoft(R) XML Parser 顯露之後,如何通過執行 XML DOM 來訪問和操作它 (Msxml.dll)。

在往下閱讀之前,應當看一下原始的 XML 文件,以便對分析程序如何使您的生活更加輕鬆有個概念。下面的代碼顯露了含有壓縮盤項目的文件 Cds.xml 的內容。每一項都含有諸如藝術家、標題和曲目等信息。

<?xml version="1.0"?> <!DOCTYPE compactdiscs SYSTEM "cds.dtd"> <compactdiscs> <compactdisc> <artist type="individual">Frank Sinatra</artist> <title numberoftracks="4">In The Wee Small Hours</title> <tracks> <track>In The Wee Small Hours</track> <track>Mood Indigo</track> <track>Glad To Be Unhappy</track> <track>I Get Along Without You Very Well</track> </tracks> <price>$12.99</price> </compactdisc> <compactdisc> <artist type="band">The Offspring</artist> <title numberoftracks="5">Americana</title> <tracks> <track>Welcome</track> <track>Have You Ever</track> <track>Staring At The Sun</track> <track>Pretty Fly (For A White Guy)</track> </tracks> <price>$12.99</price> </compactdisc> </compactdiscs> 

以上文檔的第二行涉及外部的 DTD,或者叫做“文檔類型定義”文件。DTD 定義了特定類型 XML 文檔的佈局和預期內容。XML 分析程序可以使用 DTD 來確定文檔是否有效。DTD 僅是一種方法,可以使用它幫助分析程序驗證文檔。還有一個越來越流行的驗證文檔的方法就是“XML 架構”。和 DTD 不同的是,我們使用 XML 定義架構,而 DTD 則使用它們自己“有趣的”語法。

下面的代碼顯示了 Cds.xml 使用的 Cds.dtd 的內容:

<!ELEMENT compactdiscs (compactdisc*)> <!ELEMENT compactdisc (artist, title, tracks, price)> <!ENTITY % Type "individual | band"> <!ELEMENT artist (#PCDATA)> <!ATTLIST artist type (%Type;) #REQUIRED> <!ELEMENT title (#PCDATA)> <!ATTLIST title numberoftracks CDATA #REQUIRED> <!ELEMENT tracks (track*)> <!ELEMENT price (#PCDATA)> <!ELEMENT track (#PCDATA)> 

這篇文章並不打算深入探討 DTD 和“XML 架構”。XML 架構語言(英文)是基於 XML 數據(英文)非 MS 鏈接註釋(符合 W3C)的。

DOM 的確切定義是什麼?

XML 的 DOM 是個對象模型,它顯露 XML 文檔的內容。W3C 的文檔對象模型 (DOM) 1 級規格 通常定義了 DOM 應當顯露爲什麼屬性、方法和事件。Microsoft 的 DOM 執行方法完全支持 W3C 標準,它的一些其他特性更便於在程序中使用 XML 文件。

如何使用 XML Dom?

通過創建 XML 分析程序的實例來使用 XML DOM。爲此,Microsoft 通過 Msxml.dll 中的一組標準 COM 界面來顯露 XML DOM。Msxml.dll 含有使用 XML 文檔時用到的類庫和執行代碼。如果您正在使用有腳本的客戶程序,如 Internet Explorer 中的 VBScript 執行,則通過用 CreateObject 方法創建分析程序對象的實例,來使用 DOM。

Set objParser = CreateObject( "Microsoft.XMLDOM" ) 
 

如果您正在使用來自 Active Server Page(ASP) 的 VBScript,則應當使用 Server.CreateObject

Set objParser = Server.CreateObject( "Microsoft.XMLDOM" ) 
 

如果您正在使用 Visual Basic,可以通過設置對 MSXML 類庫(在 Msxml.dll 中提供)的引用來訪問 DOM。從 Visual Basic 6.0 內部使用 MSXML 的步驟爲:

  1. 打開工程引用對話框。
  2. 從可用的 COM 對象的列表中選擇 Microsoft XML,v2.0。如果沒有找到該項,則先要獲得 MSXML 類庫。
  3. 這時可以創建分析程序對象實例。

    Dim xDoc As MSXML.DOMDocument
    Set xDoc = New MSXML.DOMDocument

從何處可以找到 Msxml.dll?獲得 MSXML 類庫的辦法有兩種:

  • 可以安裝 Internet Explorer 5.0— MSXML 分析程序是一個完整的組件。
  • 另一個辦法就是下載可再分佈的 Microsoft XML Parser 版本。

在 Visual Basic 項目中引用了類庫之後,就可以調用分析程序,加載文檔,使用文檔中的數據。

也許您現在正在疑惑—;我現在使用的是什麼?如果您打開了 MSXML 類庫,並用 Visual Basic 6.0 對象瀏覽器檢查它的對象模型,就會發現,對象模型是如此豐富。這篇文章示範瞭如何使用 DOMDocument 類和 IXMLDOMNode 接口來訪問 XML 文檔。

beginner001.gif

圖 1. MSXML 分析程序對象模型

如何加載文檔?

要加載 XML 文檔,首先必須創建 DOMDocument 類的實例:

Dim xDoc As MSXML.DOMDocument Set xDoc = New MSXML.DOMDocument 

當獲得了有效的引用之後,使用加載方法打開文件。MSXML 分析程序能從本地磁盤上加載 XML 文檔,在網上則用 UNC 引用或通過 URL 加載文檔。

若要從磁盤加載文檔,請使用加載方法創建下面的構造:

If xDoc.Load("C:/My Documents/cds.xml") Then ' 文檔加載成功。 ' 現在做一些有趣的事情。 Else ' 文檔加載不成功。 End If 

用完該文檔之後,需要將您的對象引用釋放給它。MSXML 分析程序並不顯露明確的關閉方法。最好的方法是將引用明確設置爲Nothing

Set xDoc = Nothing 

當要求分析程序加載文件時,在默認情況下,它是非同步執行的。改變該文檔的布爾 Async 屬性可以改變這個特性。重要的是檢查文檔的 ReadyState 屬性,保證文檔在開始檢查它的內容之前就已經就緒。ReadyState 屬性可能返回的值爲下列 5 種之一:

狀態
尚未初始化:加載尚未開始。 0
正在加載:正在執行加載方法。 1
已經加載:加載方法已經完成。 2
交互:對於只讀檢查有足夠的 DOM 可用,數據僅被部分分析。 3
完成:數據已被加載和分析,並可用於讀取/寫入操作。 4

MSXML 分析程序顯露了在加載大的文檔時可以跟蹤加載進程狀態的事件。當在 Internet 上從 URL 非同步加載文檔時,這些事件也有用。

若要從 URL 打開文件,請使用完整格式的 URL 指定文件的位置。在文件位置前面必須加 http:// 前綴。

這裏是從 URL 加載文件的例子:

xDoc.async = False If xDoc.Load("http://www.develop.com/hp/brianr/cds.xml") Then ' 文檔加載成功。 ' 現在做一些有趣的事情。 Else ' 文檔加載不成功。 End If 

將文檔的 Async 屬性設置爲 False,分析程序在文檔被完全加載並可以對其進行操作之前,不將控制返回到您的代碼。如果將其設置爲True,您必須在訪問該文檔之前先檢查其 ReadyState 屬性,或者利用 DOMDocument 的事件,在文檔就緒時通知您的代碼。

處理故障

由於各種各樣的原因,文檔加載很可能失敗。其中最常見的原因可能是傳送到加載方法的文檔名無效。另一個原因可能是 XML 文檔本身是無效的。

在默認情況下,MSXML 分析程序將驗證在您的文檔中是否指定了 DTD 或架構。如果在調用加載方法之前設置了 DOMDocument 對象引用的 ValidateOnParse 屬性,就令分析程序不驗證文檔。

 Dim xDoc As MSXML.DOMDocument Set xDoc = New MSXML.DOMDocument xDoc.validateOnParse = False If xDoc.Load("C:/My Documents/cds.xml") Then ' 文檔加載成功。 ' 現在做一些有趣的事情。 Else ' 文檔加載不成功。 End If 

但要事先警告您:在製作應用程序時關閉分析程序的驗證特性並不是好方法。不正確的文檔因各種理由導致程序的失敗。至少,它會向用戶提供無效的數據。

不管何種故障的類型,都可以通過訪問 ParseError 對象,要求分析程序向您提供故障信息。若要利用 ParseError 對象的屬性,請將引用設置爲文檔自身的 IXMLDOMParseError 界面。IXMLDOMParseError 界面顯露了 7 種屬性,可以用來研究錯誤的原因。

下面的例子顯示一個消息框,以及 ParseError 對象給出的所有錯誤信息。

 Dim xDoc As MSXML.DOMDocument Set xDoc = New MSXML.DOMDocument If xDoc.Load("C:/My Documents/cds.xml") Then ' 文檔加載成功。 ' 現在做一些有趣的事情。 Else ' 文檔加載不成功。 Dim strErrText As String Dim xPE As MSXML.IXMLDOMParseError ' 獲得 ParseError 對象 Set xPE = xDoc.parseError With xPE strErrText = "Your XML Document failed to load" & _ "due the following error." & vbCrLf & _ "Error #: " & .errorCode & ": " & xPE.reason & _ "Line #: " & .Line & vbCrLf & _ "Line Position: " & .linepos & vbCrLf & _ "Position In File: " & .filepos & vbCrLf & _ "Source Text: " & .srcText & vbCrLf & _ "Document URL: " & .url End With MsgBox strErrText, vbExclamation End If Set xPE = Nothing 

可用 ParseError 對象顯露的信息,將該信息顯示給用戶,將它記錄到錯誤文件中,或者自己試着糾正錯誤。

在 XML 文檔中檢索信息

加載文檔之後,下一步就是從文檔中檢索信息。雖然文檔對象是重要的,但仍可發現,在大部分時間裏都在使用 IXMLDOMNode 接口。利用 IXMLDOMNode 接口來讀寫單獨的節點元素。在做任何事情之前,必須瞭解 MSXML 分析程序通常支持的 13 種節點類型。下表列出了幾種最常遇見的節點類型。

DOM 節點類型 實例
NODE_ELEMENT <artist type="band">Offspring</artist>
NODE_ATTRIBUTE <artist type="band">Offspring</artist>
NODE_TEXT <artist type="band">Offspring</artist>
NODE_PROCESSING_INSTRUCTION <?xml version="1.0"?>
NODE_DOCUMENT_TYPE <!DOCTYPE compactdiscs SYSTEM "cds.dtd">

通過 IXMLDOMNode 接口顯露的兩個屬性來訪問節點類型。NodeType 屬性顯露了 DOMNodeType 項目的枚舉(其中有些已列入上面的表中)。此外,還可以用 NodeTypeString 來檢索節點類型的文本串。

當有了文檔的引用之後,就可以開始在節點的層次中來回移動了。從您的文檔引用可以訪問 ChildNodes 屬性,它提供了從上到下的入口,可以到達文檔中的所有節點。ChildNodes 屬性顯露了 IXMLDOMNodeList,它支持 Visual Basic For/Each 構造。因此,您可以枚舉 ChildNodes 屬性的所有單個節點。此外,ChildNodes 屬性顯露 Level 屬性,它可以返回現有子節點的數量。

文檔對象不僅顯露了 ChildNodes 屬性,還顯露了所有單個節點。這樣,與 IXMLDOMNodeHasChildNodes 屬性聯合起來,就使得在節點層次中來回移動來檢查元素、屬性和值,變得十分簡單。

需要提醒的一件事情就是,文檔元素和元素值之間的主從關係。例如,在 CD XML 文檔中,元素<標題>顯露了一首歌的標題。要檢索<標題>元素的實際值,需要尋找 NODE_TEXT 類型的節點。當找到了具有感興趣數據的節點之後,就可以檢查屬性,甚至通過 ParentNode 屬性到達並訪問其主節點。

如何在文檔中來回移動?

在 XML 文檔中,可以在一組被文檔對象顯露的節點中來回移動。因爲 XML 文檔本來就是分層的,所以編寫在整個文檔中來回移動的遞歸例程要相對容易些。

LoadDocument 例程打開 XML 文檔。然後 LoadDocument 調用另一個例程 DisplayNode,它在文檔中真正地來回移動。LoadDocument 將引用當作參數和整數值傳遞到當前打開的 XML 文檔的 ChildNodes 屬性,指定從何處開始縮排級。代碼使用縮排參數,在文檔結構的 Visual Basic“快速窗口”中,將文本的顯示格式化。

DisplayNode 函數在文檔中來回移動,尋找特定於 NODE_TEXT 類型的節點。當代碼找到了 NODE_TEXT 類型的節點之後,它用 NodeValue 屬性來檢索該節點的文本。此外,當前節點的 ParentNode 屬性被用來獲得 NODE_ELEMENT 類型節點的回溯引用。NODE_ELEMENT 類型的節點顯露了 NodeName 屬性。NodeNameNodeValue 的內容被顯示。

如果通過檢查 HasChildNodes 屬性,確定該節點有子節點,則 DisplayNode 遞歸調用其自身,直到到達該文檔的末尾。

DisplayNode 例程用 Debug.Print 將信息寫入 Visual Basic 的“快速窗口”:

Public Sub LoadDocument() Dim xDoc As MSXML.DOMDocument Set xDoc = New MSXML.DOMDocument xDoc.validateOnParse = False If xDoc.Load("C:/My Documents/sample.xml") Then ' 文檔加載成功。 ' 現在做一些有趣的事情。 DisplayNode xDoc.childNodes, 0 Else ' 文檔加載不成功。 ' 查看前面列出的錯誤信息。 End If End Sub Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _ ByVal Indent As Integer) Dim xNode As MSXML.IXMLDOMNode Indent = Indent + 2 For Each xNode In Nodes If xNode.nodeType = NODE_TEXT Then Debug.Print Space$(Indent) & xNode.parentNode.nodeName & _ ":" & xNode.nodeValue End If If xNode.hasChildNodes Then DisplayNode xNode.childNodes, Indent End If Next xNode End Sub 

DisplayNodeHasChildNodes 屬性來確定它是否應當再調用其自身。您還應當用節點的 Level 屬性並檢查大於 0 的值。

現在做什麼?

本文只作爲入門之用。現在您可以深入學習,增進對 XML 和 MSXML 分析程序的瞭解。可以做許多有趣的事情,如更新獨立節點項的值、在文檔中搜索、創建自己的文檔,等等。如果需要更多的實例、文章和下載,請訪問 MSDN Online XML Developer Center

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章