DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> XML DOM新手入門指南(1)
XML DOM新手入門指南(1)
編輯:XML詳解     

DOM 定義了分析程序應當顯露的標准命令集,使您能夠在程序中訪問 Html 和 XML 文檔內容。支持 DOM 的 XML 分析程序取出 XML 文檔中的數據,並通過一組可以對它編程的對象來顯露它。在這篇文章中,您將學會當 XML 文檔被 Microsoft(R) XML Parser 顯露之後,如何通過執行 XML DOM 來訪問和操作它 (MsXML.dll)。

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

  1. <?XML version="1.0"?> 
  2. <!DOCTYPE compactdiscs SYSTEM "cds.dtd"> 
  3. <compactdiscs> 
  4.   <compactdisc> 
  5.     <artist type="individual">Frank Sinatra</artist> 
  6.     <title numberoftracks="4">In The Wee Small Hours</title> 
  7.  <tracks> 
  8.   <track>In The Wee Small Hours</track> 
  9.   <track>Mood Indigo</track>   
  10.   <track>Glad To Be Unhappy</track> 
  11.   <track>I Get Along Without You Very Well</track> 
  12.  </tracks> 
  13.     <price>$12.99</price> 
  14.   </compactdisc> 
  15.   <compactdisc> 
  16.     <artist type="band">The Offspring</artist> 
  17.     <title numberoftracks="5">Americana</title> 
  18.  <tracks> 
  19.   <track>Welcome</track> 
  20.   <track>Have You Ever</track>   
  21.   <track>Staring At The Sun</track> 
  22.   <track>Pretty Fly (For A White Guy)</track> 
  23.  </tracks> 
  24.     <price>$12.99</price> 
  25.   </compactdisc> 
  26. </compactdiscs> 

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

  1. <!ELEMENT compactdiscs (compactdisc*)> 
  2.  <!ELEMENT compactdisc (artist, title, tracks, price)> 
  3.   <!ENTITY % Type "individual | band"> 
  4.   <!ELEMENT artist (#PCDATA)> 
  5.    <!ATTLIST artist type (%Type;) #REQUIRED> 
  6.   <!ELEMENT title (#PCDATA)> 
  7.    <!ATTLIST title numberoftracks CDATA #REQUIRED> 
  8.   <!ELEMENT tracks (track*)> 
  9.   <!ELEMENT price (#PCDATA)> 
  10.   <!ELEMENT track (#PCDATA)> 

這篇文章並不打算深入探討 DTD 和“XML架構”。XML架構語言是基於XML數據注釋(符合 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。

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

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

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

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

◆打開工程引用對話框。

◆從可用的 COM 對象的列表中選擇 Microsoft XML,v2.0。如果沒有找到該項,則先要獲得 MSXML 類庫。

◆這時可以創建分析程序對象實例。

  1. Dim xDoc As MSXML.DOMDocument  
  2. 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 文檔。

如何加載文檔?

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

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

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

  1. If xDoc.Load("C:\My Documents\cds.XML") Then  
  2.  ' 文檔加載成功。  
  3.  ' 現在做一些有趣的事情。  
  4. Else  
  5.  ' 文檔加載不成功。  
  6. End If 

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

  1. Set xDoc = Nothing 

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

MSXML 分析程序顯露了在加載大的文檔時可以跟蹤加載進程狀態的事件。當在 Internet 上從 URL 非同步加載文檔時,這些事件也有用。若要從 URL 打開文件,請使用完整格式的 URL 指定文件的位置。在文件位置前面必須加 http:// 前綴。這裡是從 URL 加載文件的例子:

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

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

處理故障

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

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

  1.  Dim xDoc As MSXML.DOMDocument  
  2.  Set xDoc = New MSXML.DOMDocument  
  3. xDoc.validateOnParse = False 
  4. If xDoc.Load("C:\My Documents\cds.XML") Then  
  5.  ' 文檔加載成功。  
  6.  ' 現在做一些有趣的事情。  
  7. Else  
  8.  ' 文檔加載不成功。  
  9. End If 

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

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

  1.  Dim xDoc As MSXML.DOMDocument  
  2.  Set xDoc = New MSXML.DOMDocument  
  3. If xDoc.Load("C:\My Documents\cds.XML") Then  
  4.  ' 文檔加載成功。  
  5.  ' 現在做一些有趣的事情。  
  6. Else  
  7.  ' 文檔加載不成功。  
  8.  Dim strErrText As String  
  9.  Dim xPE As MSXML.IXMLDOMParseError  
  10.    ' 獲得 ParseError 對象  
  11.  Set xPE = xDoc.parseError  
  12.    With xPE  
  13.     strErrText = "Your XML Document failed to load" & _  
  14.         "due the following error." & vbCrLf & _  
  15.         "Error #: " & .errorCode & ": " & xPE.reason & _  
  16.         "Line #: " & .Line & vbCrLf & _  
  17.         "Line Position: " & .linepos & vbCrLf & _  
  18.         "Position In File: " & .filepos & vbCrLf & _  
  19.         "Source Text: " & .srcText & vbCrLf & _  
  20.         "Document URL: " & .url  
  21.     End With  
  22.       
  23.     MsgBox strErrText, vbExclamation  
  24. End If  
  25. Set xPE = Nothing 

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

在XML文檔中檢索信息

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

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

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

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

需要提醒的一件事情就是,文檔元素和元素值之間的主從關系。例如,在 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 屬性。NodeName 和 NodeValue 的內容被顯示。

如果通過檢查 HasChildNodes 屬性,確定該節點有子節點,則 DisplayNode 遞歸調用其自身,直到到達該文檔的末尾。DisplayNode 例程用 Debug.Print 將信息寫入 Visual Basic 的“快速窗口”:

  1. Public Sub LoadDocument()  
  2. Dim xDoc As MSXML.DOMDocument  
  3. Set xDoc = New MSXML.DOMDocument  
  4. xDoc.validateOnParse = False 
  5. If xDoc.Load("C:\My Documents\sample.XML") Then  
  6.  ' 文檔加載成功。  
  7.  ' 現在做一些有趣的事情。  
  8.  DisplayNode xDoc.childNodes, 0  
  9. Else  
  10.  ' 文檔加載不成功。  
  11.  ' 查看前面列出的錯誤信息。  
  12. End If  
  13. End Sub  
  14.  
  15. Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _   
  16.  ByVal Indent As Integer)  
  17.    
  18.  Dim xNode As MSXML.IXMLDOMNode  
  19.  IndentIndent = Indent + 2  
  20.  
  21.  For Each xNode In Nodes  
  22.   If xNode.nodeType = NODE_TEXT Then  
  23.    Debug.Print Space$(Indent) & xNode.parentNode.nodeName & _  
  24.     ":" & xNode.nodeValue  
  25.   End If  
  26.  
  27.   If xNode.hasChildNodes Then  
  28.    DisplayNode xNode.childNodes, Indent  
  29.   End If  
  30.  Next xNode  
  31. End Sub 

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

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved