驗證的閱讀器
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;
}
}