標籤:style c tar ext color int
使用Asp.Net中的XmlValidatingReader來驗證XML Schema.
這段時間,我正在學習XML,書上介紹使用Xerces-C或Xerces-J來驗證XML文檔的Schema或DTD,結果,發現上面的工具不好用.
後來,只有放下書,到書店看看,有沒有其他什麼書能帶來協助.當檢到Professiona ASP.NET XML with C# 這本書時,裡面講到了使用System.Xml 和 System.Xml.Schema命名空間下的XmlTextReader類和XmlValidatingReader類來驗證帶有Schema或DTD的XML文檔.便買下來了.
回寢室後,根據書裡面面的介紹,寫了一個小的測試程式,發現還很管用,在這裡,但貼出來,希望給需要的人有協助.
代碼如下:
<%@Page Debug="true"%>
<%@Import Namespace="System"%>
<%@Import Namespace="System.Xml"%>
<%@Import Namespace="System.Xml.Schema"%>
<script language="C#" runat="server">
protected void uploadBtn_Click(Object sender,EventArgs e)
{
XmlTextReader myXml = null;
XmlValidatingReader myXmlDoc = null;
int nElements = 0; //統計文檔中element的個數
int nAttributes = 0; //統計文檔中Attributes的個數
int nComments = 0; //統計文檔中 Comment的個數
int nPIs = 0; //統計文檔中ProcessingInstruction的個數
int nCDATAs = 0; //統計文檔中CDATA的個數
string sWorkingText = "";
resultArea.Text = "";
try
{
//裝載XML Document
myXml = new XmlTextReader(fileSelector.PostedFile.InputStream);
myXml.WhitespaceHandling = WhitespaceHandling.None;
//XmlValidatingReader是XmlTextReader的協助功能
//需要從XmlTextReader對象擷取執行個體
myXmlDoc = new XmlValidatingReader(myXml);
myXmlDoc.ValidationType = ValidationType.Auto;
//驗證事件委託的簽名
myXmlDoc.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventCallBack);
//在遍曆XML文檔的時候,XmlValidatingReadert將根據Schema或DTD
//對XML進行驗證。
while(myXmlDoc.Read())
{
//這裡面的語句的作用主要是分析XML文檔各NODE,
//但while迴圈還是必要,因為只有逐個遍曆所有個的NODE,才會檢查出驗證是否匹配。
switch(myXmlDoc.NodeType) //Judge Crrent Node‘s type. 判定當前結點的類型
{
case XmlNodeType.Element : // Element 元素
++nElements;
nAttributes += myXmlDoc.AttributeCount;
break;
case XmlNodeType.Text : //常值內容
sWorkingText ="<b>text:</b>" + myXmlDoc.Value + "<br/>";
resultArea.Text += sWorkingText;
break;
case XmlNodeType.Comment: //注釋
++nCommen;
break;
case XmlNodeType.ProcessingInstruction: //處理指示
++nPIs;
break;
case XmlNodeType.CDATA: //CDATA
++nCDATAs;
break;
}
}
sWorkingText = "<br/>" + "Total number of elements:" + nElements + "<br/>";
sWorkingText += "Total number of attributes in document:" + nAttributes + "<br/>";
sWorkingText += "Total comments:" + nComments + "<br/>";
sWorkingText += "Total processingInstructions:" + nPIs + "<br/>";
sWorkingText += "Total CDATA sections:" + nCDATAs;
resultArea.Text += sWorkingText;
}
catch(XmlException exec)
{
sWorkingText = "Exception while parsing:" + "<br/>";
sWorkingText += "Line number:" + exec.LineNumber + "<br/>";
sWorkingText += "Message:" + exec.Message + "<br/>" + "<br/>";
sWorkingText += "Line position:" + exec.LinePosition + "<br/>";
sWorkingText += "Stack Trace:" + "<br/>" + exec.StackTrace;
resultArea.Text = sWorkingText;
}
finally
{
if (myXmlDoc!=null)
{
myXmlDoc.Close();
}
}
}