在.NET Framework中輕鬆處理XML資料(三)

來源:互聯網
上載者:User
xml|資料 帶驗證的閱讀器

XmlValidatingReader類實現了XmlReader類,它提供了支援多種類型的XML驗證:DTD,XML-Data Reduced(XDR)架構,以及XSD,DTD和XSD都是W3C官方推薦的。而XDR是Microsoft早期用於處理XML構架的一種格式。

你可以用XmlVlidatingReader類去驗證XML文檔和XML片斷。XmlValidatingReader類工作在XML閱讀器上面---是一個典型的XMLTextReader類執行個體。XMLTextReade用於讀取文檔的節點,但是XmlVlidatingReader依據需要的驗證類型去驗證每一個XML塊。

XmlVlidatingReader類只實現了非常小的XML閱讀器必備的一個功能子集。該類總是工作在一個已存在的XML閱讀器上面,它監視方法和屬性。如果你深入該類的建構函式,你會發現它很明顯的依靠一個已存在的文本閱讀器。帶驗證的XML閱讀器不能直接的從一個檔案或一個URL序列化。該類的建構函式列表如下:

public XmlValidatingReader(XmlReader);

public XmlValidatingReader(Stream, XmlNodeType, XmlParserContext);

public XmlValidatingReader(string, XmlNodeType, XmlParserContext);

帶驗證的XML閱讀器能分析任何的XML片斷,XML片斷通過一個string或者一個stream提供,也可以分析任何閱讀器提供的XML文檔。

XmlVlidatingReader類中有重大改變的方法非常少(相對其它reader類來說),另外對 Read,它有Skip和ReadTypedValue方法。Skip方法跳過當前節點所有的子節點(你不能跳過不良格式的XML文本,它是相當有用的演算法),Skip方法也驗證被跳過的內容。ReadTypedValue方法返回指定 XML 結構描述 (XSD) 類型對應的CLR類型。如果該方法找到了XSD類型對應的CLR類型,則返回CLR的類型名。如果找不到,則把該節點的值作為一個字串值返回。

帶驗證的XML閱讀器正如其名,它是一個基於節點的閱讀器,它驗證當前節點的結構是否符合當前的schema。驗證是增量式的;它沒有方法返回表示文檔是否有效布爾值。通常你都是用Read方法去讀輸入的XML文檔。實際上,你也可以用帶驗證的閱讀器去讀XML文檔。在每一步中,當前被訪問的節點的結構是否與指定的schema符合,如果不符合,拋出一個異常。圖四是一個控制台應用程式,它有一個要輸入檔案名稱的命令列,最後輸出驗證結果。

Figure 4 Console App

using System;

using System.Xml;

using System.Xml.Schema;

class MyXmlValidApp

{

public MyXmlValidApp(String fileName)

{

try {

Validate(fileName);

}

catch (Exception e) {

Console.WriteLine("Error:\t{0}", e.Message);

Console.WriteLine("Exception raised: {0}",

e.GetType().ToString());

}

}

private void Validate(String fileName)

{

XmlTextReader xtr = new XmlTextReader(fileName);

XmlValidatingReader vreader = new XmlValidatingReader(xtr);

vreader.ValidationType = ValidationType.Auto;

vreader.ValidationEventHandler += new

ValidationEventHandler(this.ValidationEventHandle);

vreader.Read();

vreader.MoveToContent();

while (vreader.Read()) {}

xtr.Close();

vreader.Close();

}

public void ValidationEventHandle(Object sender,

ValidationEventArgs args)

{

Console.Write("Validation error: " + args.Message + "\r\n");

}

public static void Main(String[] args)

{

MyXmlValidApp o = new MyXmlValidApp(args[0]);

return;

}

}

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

驗證發生在使用者用Read方法向前移動指標時,一旦節點被分析和讀取,它獲得傳送過來的處理驗證的內部的對象。驗證操作是基於節點類型及被要求的驗證類型。它確認節點所有的屬性和節點包含的子節點是否符合驗證條件。

驗證對象在內部調用兩個不同風格的對象:DTD分析器和架構產生器(schema builder)。DTD分析器處理當前節點的內容和不符合DTD的子樹。架構產生器根據XDR或者XSD架構對當前的節點構建一個SOM(schema object model)。架構產生器類實際上是所有指定為XDR和XSD架構產生器的基類。為什麼呢,雖然XDR和XSD架構的許多相同的方法被加工處理過,但是它們在執行時的效能沒有區別。

如果節點有子節點,用另一個臨時的閱讀器收集子節點資訊,因此節點的架構資訊能被完全地驗證。你可以看圖五:



注意,儘管XmlValidatingReader類的建構函式可以接受一個XmlReader類作為其閱讀器,但是該閱讀器只能是XmlTextReader類的一個執行個體或者是它的一個衍生類別的執行個體。這意味著你不能用其它從XmlReader派生的類(例如一個自訂的XML閱讀器)。在XmlValidatingReader類的內部,它假設閱讀器是一個子XmlTextReader對象及把傳入的閱讀器顯式的轉換成XmlTextReader類。如果你用XmlNodeReader或者自訂的閱讀器器,程式在編譯時間會出錯,運行時拋出一個異常。


節點閱讀器

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

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

// xmldomNode is the XML DOM node

XmlNodeReader nodeReader = new XmlNodeReader(xmldomNode);

while (nodeReader.Read())

{

// Do something here

}

當你要在設定檔(例如web.cofig檔案)中引用自訂的資料時,先把這些資料填充到XMLDOM樹中,然後用XmlNodeReader類與XMLDOM類結合處理這些資料。這也是高效的。

    作者:chyich(譯)/ASPCool



相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。