自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

XML DOM新手入門(mén)指南

開(kāi)發(fā)
文章將介紹XML DOM的基本知識(shí),適合初學(xué)者學(xué)習(xí),不過(guò),在您閱讀本文之前,應(yīng)當(dāng)看一下原始的XML文件,以便對(duì)分析程序如何使您的生活更加輕松有個(gè)概念。

DOM 定義了分析程序應(yīng)當(dāng)顯露的標(biāo)準(zhǔn)命令集,使您能夠在程序中訪問(wèn) HTML 和 XML 文檔內(nèi)容。支持 DOM 的 XML 分析程序取出 XML 文檔中的數(shù)據(jù),并通過(guò)一組可以對(duì)它編程的對(duì)象來(lái)顯露它。在這篇文章中,您將學(xué)會(huì)當(dāng) XML 文檔被 Microsoft(R) XML Parser 顯露之后,如何通過(guò)執(zhí)行 XML DOM 來(lái)訪問(wèn)和操作它 (Msxml.dll)。

在往下閱讀之前,應(yīng)當(dāng)看一下原始的 XML 文件,以便對(duì)分析程序如何使您的生活更加輕松有個(gè)概念。下面的代碼顯露了含有壓縮盤(pán)項(xiàng)目的文件 Cds.xml 的內(nèi)容。每一項(xiàng)都含有諸如藝術(shù)家、標(biāo)題和曲目等信息。

  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,或者叫做“文檔類(lèi)型定義”文件。DTD 定義了特定類(lèi)型 XML 文檔的布局和預(yù)期內(nèi)容。XML 分析程序可以使用 DTD 來(lái)確定文檔是否有效。DTD 僅是一種方法,可以使用它幫助分析程序驗(yàn)證文檔。還有一個(gè)越來(lái)越流行的驗(yàn)證文檔的方法就是“XML 架構(gòu)”。和 DTD 不同的是,我們使用 XML 定義架構(gòu),而 DTD 則使用它們自己“有趣的”語(yǔ)法。下面的代碼顯示了 Cds.xml 使用的 Cds.dtd 的內(nèi)容:

  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架構(gòu)”。XML架構(gòu)語(yǔ)言是基于XML數(shù)據(jù)注釋(符合 W3C)的。

DOM 的確切定義是什么?

XML 的 DOM 是個(gè)對(duì)象模型,它顯露 XML 文檔的內(nèi)容。W3C 的文檔對(duì)象模型 (DOM) 1 級(jí)規(guī)格 通常定義了 DOM 應(yīng)當(dāng)顯露為什么屬性、方法和事件。Microsoft 的 DOM 執(zhí)行方法完全支持 W3C 標(biāo)準(zhǔn),它的一些其他特性更便于在程序中使用 XML 文件。

如何使用 XML Dom?

通過(guò)創(chuàng)建 XML 分析程序的實(shí)例來(lái)使用 XML DOM。為此,Microsoft 通過(guò) Msxml.dll 中的一組標(biāo)準(zhǔn) COM 界面來(lái)顯露 XML DOM。Msxml.dll 含有使用 XML 文檔時(shí)用到的類(lèi)庫(kù)和執(zhí)行代碼。如果您正在使用有腳本的客戶程序,如 Internet Explorer 中的 VBScript 執(zhí)行,則通過(guò)用 CreateObject 方法創(chuàng)建分析程序?qū)ο蟮膶?shí)例,來(lái)使用 DOM。

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

如果您正在使用來(lái)自 Active Server Page(ASP) 的 VBScript,則應(yīng)當(dāng)使用 Server.CreateObject。

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

如果您正在使用 Visual Basic,可以通過(guò)設(shè)置對(duì) MSXML 類(lèi)庫(kù)(在 Msxml.dll 中提供)的引用來(lái)訪問(wèn) DOM。從 Visual Basic 6.0 內(nèi)部使用 MSXML 的步驟為:

◆打開(kāi)工程引用對(duì)話框。

◆從可用的 COM 對(duì)象的列表中選擇 Microsoft XML,v2.0。如果沒(méi)有找到該項(xiàng),則先要獲得 MSXML 類(lèi)庫(kù)。

◆這時(shí)可以創(chuàng)建分析程序?qū)ο髮?shí)例。

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

從何處可以找到 Msxml.dll?獲得 MSXML 類(lèi)庫(kù)的辦法有兩種:

可以安裝 Internet Explorer 5.0— MSXML 分析程序是一個(gè)完整的組件。

◆另一個(gè)辦法就是下載可再分布的 Microsoft XML Parser 版本。

◆在 Visual Basic 項(xiàng)目中引用了類(lèi)庫(kù)之后,就可以調(diào)用分析程序,加載文檔,使用文檔中的數(shù)據(jù)。

也許您現(xiàn)在正在疑惑—;我現(xiàn)在使用的是什么?如果您打開(kāi)了 MSXML 類(lèi)庫(kù),并用 Visual Basic 6.0 對(duì)象瀏覽器檢查它的對(duì)象模型,就會(huì)發(fā)現(xiàn),對(duì)象模型是如此豐富。這篇文章示范了如何使用 DOMDocument 類(lèi)和 IXMLDOMNode 接口來(lái)訪問(wèn) XML 文檔。

#p#

如何加載文檔?

要加載 XML 文檔,首先必須創(chuàng)建 DOMDocument 類(lèi)的實(shí)例:

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

當(dāng)獲得了有效的引用之后,使用加載方法打開(kāi)文件。MSXML 分析程序能從本地磁盤(pán)上加載 XML 文檔,在網(wǎng)上則用 UNC 引用或通過(guò) URL 加載文檔。若要從磁盤(pán)加載文檔,請(qǐng)使用加載方法創(chuàng)建下面的構(gòu)造:

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

用完該文檔之后,需要將您的對(duì)象引用釋放給它。MSXML 分析程序并不顯露明確的關(guān)閉方法。***的方法是將引用明確設(shè)置為Nothing。

  1. Set xDoc = Nothing 

當(dāng)要求分析程序加載文件時(shí),在默認(rèn)情況下,它是非同步執(zhí)行的。改變?cè)撐臋n的布爾 Async 屬性可以改變這個(gè)特性。重要的是檢查文檔的 ReadyState 屬性,保證文檔在開(kāi)始檢查它的內(nèi)容之前就已經(jīng)就緒。ReadyState 屬性可能返回的值為下列 5 種之一:

MSXML 分析程序顯露了在加載大的文檔時(shí)可以跟蹤加載進(jìn)程狀態(tài)的事件。當(dāng)在 Internet 上從 URL 非同步加載文檔時(shí),這些事件也有用。若要從 URL 打開(kāi)文件,請(qǐng)使用完整格式的 URL 指定文件的位置。在文件位置前面必須加 http:// 前綴。這里是從 URL 加載文件的例子:

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

將文檔的 Async 屬性設(shè)置為 False,分析程序在文檔被完全加載并可以對(duì)其進(jìn)行操作之前,不將控制返回到您的代碼。如果將其設(shè)置為T(mén)rue,您必須在訪問(wèn)該文檔之前先檢查其 ReadyState 屬性,或者利用 DOMDocument 的事件,在文檔就緒時(shí)通知您的代碼。

處理故障

由于各種各樣的原因,文檔加載很可能失敗。其中最常見(jiàn)的原因可能是傳送到加載方法的文檔名無(wú)效。另一個(gè)原因可能是 XML 文檔本身是無(wú)效的。

在默認(rèn)情況下,MSXML 分析程序?qū)Ⅱ?yàn)證在您的文檔中是否指定了 DTD 或架構(gòu)。如果在調(diào)用加載方法之前設(shè)置了 DOMDocument 對(duì)象引用的 ValidateOnParse 屬性,就令分析程序不驗(yàn)證文檔。

  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.  ' 現(xiàn)在做一些有趣的事情。  
  7. Else  
  8.  ' 文檔加載不成功。  
  9. End If 

但要事先警告您:在制作應(yīng)用程序時(shí)關(guān)閉分析程序的驗(yàn)證特性并不是好方法。不正確的文檔因各種理由導(dǎo)致程序的失敗。至少,它會(huì)向用戶提供無(wú)效的數(shù)據(jù)。

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

  1.  Dim xDoc As MSXML.DOMDocument  
  2.  Set xDoc = New MSXML.DOMDocument  
  3. If xDoc.Load("C:\My Documents\cds.xml") Then  
  4.  ' 文檔加載成功。  
  5.  ' 現(xiàn)在做一些有趣的事情。  
  6. Else  
  7.  ' 文檔加載不成功。  
  8.  Dim strErrText As String  
  9.  Dim xPE As MSXML.IXMLDOMParseError  
  10.    ' 獲得 ParseError 對(duì)象  
  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 對(duì)象顯露的信息,將該信息顯示給用戶,將它記錄到錯(cuò)誤文件中,或者自己試著糾正錯(cuò)誤。

#p#

在XML文檔中檢索信息

加載文檔之后,下一步就是從文檔中檢索信息。雖然文檔對(duì)象是重要的,但仍可發(fā)現(xiàn),在大部分時(shí)間里都在使用 IXMLDOMNode 接口。利用 IXMLDOMNode 接口來(lái)讀寫(xiě)單獨(dú)的節(jié)點(diǎn)元素。在做任何事情之前,必須了解 MSXML 分析程序通常支持的 13 種節(jié)點(diǎn)類(lèi)型。下表列出了幾種最常遇見(jiàn)的節(jié)點(diǎn)類(lèi)型。

通過(guò) IXMLDOMNode 接口顯露的兩個(gè)屬性來(lái)訪問(wèn)節(jié)點(diǎn)類(lèi)型。NodeType 屬性顯露了 DOMNodeType 項(xiàng)目的枚舉(其中有些已列入上面的表中)。此外,還可以用 NodeTypeString 來(lái)檢索節(jié)點(diǎn)類(lèi)型的文本串。

當(dāng)有了文檔的引用之后,就可以開(kāi)始在節(jié)點(diǎn)的層次中來(lái)回移動(dòng)了。從您的文檔引用可以訪問(wèn) ChildNodes 屬性,它提供了從上到下的入口,可以到達(dá)文檔中的所有節(jié)點(diǎn)。ChildNodes 屬性顯露了 IXMLDOMNodeList,它支持 Visual Basic For/Each 構(gòu)造。因此,您可以枚舉 ChildNodes 屬性的所有單個(gè)節(jié)點(diǎn)。此外,ChildNodes 屬性顯露 Level 屬性,它可以返回現(xiàn)有子節(jié)點(diǎn)的數(shù)量。

文檔對(duì)象不僅顯露了 ChildNodes 屬性,還顯露了所有單個(gè)節(jié)點(diǎn)。這樣,與 IXMLDOMNode 的 HasChildNodes 屬性聯(lián)合起來(lái),就使得在節(jié)點(diǎn)層次中來(lái)回移動(dòng)來(lái)檢查元素、屬性和值,變得十分簡(jiǎn)單。

需要提醒的一件事情就是,文檔元素和元素值之間的主從關(guān)系。例如,在 CD XML 文檔中,元素<標(biāo)題>顯露了一首歌的標(biāo)題。要檢索<標(biāo)題>元素的實(shí)際值,需要尋找 NODE_TEXT 類(lèi)型的節(jié)點(diǎn)。當(dāng)找到了具有感興趣數(shù)據(jù)的節(jié)點(diǎn)之后,就可以檢查屬性,甚至通過(guò) ParentNode 屬性到達(dá)并訪問(wèn)其主節(jié)點(diǎn)。

如何在文檔中來(lái)回移動(dòng)?

在 XML 文檔中,可以在一組被文檔對(duì)象顯露的節(jié)點(diǎn)中來(lái)回移動(dòng)。因?yàn)?XML 文檔本來(lái)就是分層的,所以編寫(xiě)在整個(gè)文檔中來(lái)回移動(dòng)的遞歸例程要相對(duì)容易些。LoadDocument 例程打開(kāi) XML 文檔。然后 LoadDocument 調(diào)用另一個(gè)例程 DisplayNode,它在文檔中真正地來(lái)回移動(dòng)。LoadDocument 將引用當(dāng)作參數(shù)和整數(shù)值傳遞到當(dāng)前打開(kāi)的 XML 文檔的 ChildNodes 屬性,指定從何處開(kāi)始縮排級(jí)。代碼使用縮排參數(shù),在文檔結(jié)構(gòu)的 Visual Basic“快速窗口”中,將文本的顯示格式化。

DisplayNode 函數(shù)在文檔中來(lái)回移動(dòng),尋找特定于 NODE_TEXT 類(lèi)型的節(jié)點(diǎn)。當(dāng)代碼找到了 NODE_TEXT 類(lèi)型的節(jié)點(diǎn)之后,它用 NodeValue 屬性來(lái)檢索該節(jié)點(diǎn)的文本。此外,當(dāng)前節(jié)點(diǎn)的 ParentNode 屬性被用來(lái)獲得 NODE_ELEMENT 類(lèi)型節(jié)點(diǎn)的回溯引用。NODE_ELEMENT 類(lèi)型的節(jié)點(diǎn)顯露了 NodeName 屬性。NodeName 和 NodeValue 的內(nèi)容被顯示。

如果通過(guò)檢查 HasChildNodes 屬性,確定該節(jié)點(diǎn)有子節(jié)點(diǎn),則 DisplayNode 遞歸調(diào)用其自身,直到到達(dá)該文檔的末尾。DisplayNode 例程用 Debug.Print 將信息寫(xiě)入 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.  ' 現(xiàn)在做一些有趣的事情。  
  8.  DisplayNode xDoc.childNodes, 0  
  9. Else  
  10.  ' 文檔加載不成功。  
  11.  ' 查看前面列出的錯(cuò)誤信息。  
  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屬性來(lái)確定它是否應(yīng)當(dāng)再調(diào)用其自身。您還應(yīng)當(dāng)用節(jié)點(diǎn)的Level屬性并檢查大于0的值。

【編輯推薦】

  1. 構(gòu)建輕量級(jí)XML DOM分析程序
  2. 在JavaScript中如何實(shí)現(xiàn)DOM操作
  3. 減少瀏覽器重解析 JavaScript DOM操作優(yōu)化方案 
責(zé)任編輯:王曉東 來(lái)源: CSDN
相關(guān)推薦

2009-03-19 09:24:50

XML標(biāo)記XML結(jié)構(gòu)XML入門(mén)

2013-12-24 10:04:01

PostgreSQL

2011-02-21 17:51:39

Zimbra入門(mén)新手

2011-01-10 14:36:00

新手linux基礎(chǔ)

2011-05-31 16:47:47

SEO

2010-06-23 15:00:50

Fix協(xié)議

2011-03-22 11:06:52

Nagios安裝

2018-08-31 21:35:26

iOSUI設(shè)計(jì)師設(shè)計(jì)

2010-05-28 18:22:51

MySQL基本操作

2015-07-31 14:23:16

Windows 10開(kāi)始菜單

2009-07-16 09:07:46

Linux使用技巧Linux入門(mén)Linux開(kāi)發(fā)

2010-05-14 18:31:17

MySQL 定時(shí)數(shù)據(jù)備

2010-05-17 09:52:55

虛擬化VMware Play

2010-06-10 10:31:36

MySQL出錯(cuò)代碼列表

2010-06-21 15:27:38

Linux apt-g

2011-06-30 17:41:46

SEO

2010-06-19 13:47:39

AMF協(xié)議

2009-08-03 13:29:14

SearchServe操作系統(tǒng)微軟

2011-04-01 10:18:22

NoSQLCouchDB

2018-04-17 11:00:13

數(shù)據(jù)庫(kù)MySQL命令大全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)