明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

在.NET Framework中簡單處理XML數(shù)據(jù)(3-2)

[摘要]ValidationType屬性設(shè)置驗(yàn)證的類型,它可以是:DTD, XSD, XDR或者none。如果沒有指定驗(yàn)證的類型(用ValidationType.Auto選項(xiàng)),閱讀器將自動的根據(jù)文檔用最適合的驗(yàn)證類型。在驗(yàn)證過程中出現(xiàn)任何錯(cuò)誤,都會觸發(fā)ValidationEventHandler事件...
ValidationType屬性設(shè)置驗(yàn)證的類型,它可以是:DTD, XSD, XDR或者none。如果沒有指定驗(yàn)證的類型(用ValidationType.Auto選項(xiàng)),閱讀器將自動的根據(jù)文檔用最適合的驗(yàn)證類型。在驗(yàn)證過程中出現(xiàn)任何錯(cuò)誤,都會觸發(fā)ValidationEventHandler事件。如果未提供事件ValidationEventHandler事件處理程序,則拋出一個(gè)XML異常。定義ValidationEventHandler事件處理程序是用于捕捉任何在XML源文件中存在錯(cuò)誤而引發(fā)XML異常的一種方法。要注意的是閱讀器的原理是檢查一個(gè)文檔是否是格式良好的,以及檢查文檔是否與架構(gòu)吻合。如果帶驗(yàn)證的閱讀器發(fā)現(xiàn)一個(gè)有嚴(yán)重的格式錯(cuò)誤的XML文檔,只會觸發(fā)XmlException異常,它不會觸發(fā)其它的事件。

驗(yàn)證發(fā)生在用戶用Read方法向前移動指針時(shí),一旦節(jié)點(diǎn)被分析和讀取,它獲得傳送過來的處理驗(yàn)證的內(nèi)部的對象。驗(yàn)證操作是基于節(jié)點(diǎn)類型及被要求的驗(yàn)證類型。它確認(rèn)節(jié)點(diǎn)所有的屬性和節(jié)點(diǎn)包含的子節(jié)點(diǎn)是否符合驗(yàn)證條件。

驗(yàn)證對象在內(nèi)部調(diào)用兩個(gè)不同風(fēng)格的對象:DTD分析器和架構(gòu)生成器(schema builder)。DTD分析器處理當(dāng)前節(jié)點(diǎn)的內(nèi)容和不符合DTD的子樹。架構(gòu)生成器根據(jù)XDR或者XSD架構(gòu)對當(dāng)前的節(jié)點(diǎn)構(gòu)建一個(gè)SOM(schema object model)。架構(gòu)生成器類實(shí)際上是所有指定為XDR和XSD架構(gòu)生成器的基類。為什么呢,雖然XDR和XSD架構(gòu)的許多相同的方法被加工處理過,但是它們在執(zhí)行時(shí)的性能沒有區(qū)別。

如果節(jié)點(diǎn)有子節(jié)點(diǎn),用另一個(gè)臨時(shí)的閱讀器收集子節(jié)點(diǎn)信息,因此節(jié)點(diǎn)的架構(gòu)信息能被完全地驗(yàn)證。你可以看圖五:



注意,盡管XmlValidatingReader類的構(gòu)造函數(shù)可以接受一個(gè)XmlReader類作為其閱讀器,但是該閱讀器只能是XmlTextReader類的一個(gè)實(shí)例或者是它的一個(gè)派生類的實(shí)例。這意味著你不能用其它從XmlReader派生的類(例如一個(gè)自定義的XML閱讀器)。在XmlValidatingReader類的內(nèi)部,它假設(shè)閱讀器是一個(gè)子XmlTextReader對象及把傳入的閱讀器顯式的轉(zhuǎn)換成XmlTextReader類。如果你用XmlNodeReader或者自定義的閱讀器器,程序在編譯時(shí)會出錯(cuò),運(yùn)行時(shí)拋出一個(gè)異常。


節(jié)點(diǎn)閱讀器

XML閱讀器提供一種增量式的方法(一個(gè)一個(gè)節(jié)點(diǎn)的讀)來處理文檔的內(nèi)容。到目前為止,我們假設(shè)源文件是一個(gè)基于硬盤的流或者是一個(gè)字符串流,然而,我們不能保證在實(shí)際中會提供一個(gè)源文件的XMLDOM對象給我們。在這種情況下,我們需要一個(gè)帶有特別的讀方法的特別的類。對這種情況,.NET Framework提供了XmlNodeReader類。

就像XmlTextReader訪問指定XML流中所有節(jié)點(diǎn)一樣,XmlNodeReader類訪問XMLDOM子樹的所有節(jié)點(diǎn)。XMLDOM類(在.NET Framework中的XmlDocument類)支持基于Xpath的方法,例如SelectNodes方法和SelectSingleNode方法。這些方法的作用是把匹配的節(jié)點(diǎn)放在內(nèi)存中。如果你需要處理子樹中的所有節(jié)點(diǎn),節(jié)點(diǎn)閱讀器比用增量式方法處理節(jié)點(diǎn)的閱讀器具有更高的效率:

// xmldomNode is the XML DOM node

XmlNodeReader nodeReader = new XmlNodeReader(xmldomNode);

while (nodeReader.Read())

{

// Do something here

}

當(dāng)你要在配置文件(例如web.cofig文件)中引用自定義的數(shù)據(jù)時(shí),先把這些數(shù)據(jù)填充到XMLDOM樹中,然后用XmlNodeReader類與XMLDOM類結(jié)合處理這些數(shù)據(jù)。這也是高效的。