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

在.NET Framework中簡(jiǎn)單處理XML數(shù)據(jù)(3-1)

[摘要]?zhēng)?yàn)證的閱讀器 XmlValidatingReader類實(shí)現(xiàn)了XmlReader類,它提供了支持多種類型的XML驗(yàn)證:DTD,XML-Data Reduced(XDR)架構(gòu),以及XSD,DTD和XSD都是W3C官方推薦的。而XDR是Microsoft早期用于處理XML構(gòu)架的一種格式。 ...
帶驗(yàn)證的閱讀器

XmlValidatingReader類實(shí)現(xiàn)了XmlReader類,它提供了支持多種類型的XML驗(yàn)證:DTD,XML-Data Reduced(XDR)架構(gòu),以及XSD,DTD和XSD都是W3C官方推薦的。而XDR是Microsoft早期用于處理XML構(gòu)架的一種格式。

你可以用XmlVlidatingReader類去驗(yàn)證XML文檔和XML片斷。XmlValidatingReader類工作在XML閱讀器上面---是一個(gè)典型的XMLTextReader類實(shí)例。XMLTextReade用于讀取文檔的節(jié)點(diǎn),但是XmlVlidatingReader依據(jù)需要的驗(yàn)證類型去驗(yàn)證每一個(gè)XML塊。

XmlVlidatingReader類只實(shí)現(xiàn)了非常小的XML閱讀器必備的一個(gè)功能子集。該類總是工作在一個(gè)已存在的XML閱讀器上面,它監(jiān)視方法和屬性。如果你深入該類的構(gòu)造函數(shù),你會(huì)發(fā)現(xiàn)它很明顯的依靠一個(gè)已存在的文本閱讀器。帶驗(yàn)證的XML閱讀器不能直接的從一個(gè)文件或一個(gè)URL序列化。該類的構(gòu)造函數(shù)列表如下:

public XmlValidatingReader(XmlReader);

public XmlValidatingReader(Stream, XmlNodeType, XmlParserContext);

public XmlValidatingReader(string, XmlNodeType, XmlParserContext);

?zhēng)?yàn)證的XML閱讀器能分析任何的XML片斷,XML片斷通過(guò)一個(gè)string或者一個(gè)stream提供,也可以分析任何閱讀器提供的XML文檔。

XmlVlidatingReader類中有重大改變的方法非常少(相對(duì)其它reader類來(lái)說(shuō)),另外對(duì) Read,它有Skip和ReadTypedValue方法。Skip方法跳過(guò)當(dāng)前節(jié)點(diǎn)所有的子節(jié)點(diǎn)(你不能跳過(guò)不良格式的XML文本,它是相當(dāng)有用的算法),Skip方法也驗(yàn)證被跳過(guò)的內(nèi)容。ReadTypedValue方法返回指定 XML 架構(gòu) (XSD) 類型對(duì)應(yīng)的CLR類型。如果該方法找到了XSD類型對(duì)應(yīng)的CLR類型,則返回CLR的類型名。如果找不到,則把該節(jié)點(diǎn)的值作為一個(gè)字符串值返回。

?zhēng)?yàn)證的XML閱讀器正如其名,它是一個(gè)基于節(jié)點(diǎn)的閱讀器,它驗(yàn)證當(dāng)前節(jié)點(diǎn)的結(jié)構(gòu)是否符合當(dāng)前的schema。驗(yàn)證是增量式的;它沒(méi)有方法返回表示文檔是否有效的布爾值。通常你都是用Read方法去讀輸入的XML文檔。實(shí)際上,你也可以用帶驗(yàn)證的閱讀器去讀XML文檔。在每一步中,當(dāng)前被訪問(wèn)的節(jié)點(diǎn)的結(jié)構(gòu)是否與指定的schema符合,如果不符合,拋出一個(gè)異常。圖四是一個(gè)控制臺(tái)應(yīng)用程序,它有一個(gè)要輸入文件名的命令行,最后輸出驗(yàn)證結(jié)果。

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;

}

}