使用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"%>

  1<script language="C#" runat="server">   
  2protected void uploadBtn_Click(Object sender,EventArgs e)   
  3{   
  4XmlTextReader myXml = null;   
  5XmlValidatingReader myXmlDoc = null;   
  6  
  7int nElements = 0; //统计文档中element的个数   
  8int nAttributes = 0; //统计文档中Attributes的个数   
  9int nComments = 0; //统计文档中 Comment的个数   
 10int nPIs = 0; //统计文档中ProcessingInstruction的个数   
 11int nCDATAs = 0; //统计文档中CDATA的个数   
 12  
 13string sWorkingText = "";   
 14resultArea.Text = "";   
 15  
 16  
 17  
 18try   
 19{   
 20//装载XML Document   
 21myXml = new XmlTextReader(fileSelector.PostedFile.InputStream);   
 22myXml.WhitespaceHandling = WhitespaceHandling.None;   
 23  
 24//XmlValidatingReader是XmlTextReader的帮助功能   
 25//需要从XmlTextReader对象获取实例   
 26myXmlDoc = new XmlValidatingReader(myXml);   
 27myXmlDoc.ValidationType = ValidationType.Auto;   
 28//验证事件委托的签名   
 29myXmlDoc.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventCallBack);   
 30  
 31
 32
 33//在遍历XML文档的时候,XmlValidatingReadert将根据Schema或DTD   
 34//对XML进行验证。   
 35while(myXmlDoc.Read())   
 36{   
 37//这里面的语句的作用主要是分析XML文档各NODE,   
 38//但while循环还是必要,因为只有逐个遍历所有个的NODE,才会检查出验证是否匹配。   
 39  
 40switch(myXmlDoc.NodeType) //Judge Crrent Node's type. 判定当前结点的类型   
 41{   
 42case XmlNodeType.Element : // Element 元素   
 43++nElements;   
 44nAttributes += myXmlDoc.AttributeCount;   
 45break;   
 46case XmlNodeType.Text : //文本内容   
 47sWorkingText ="<b>text:</b>" + myXmlDoc.Value + "
 48";   
 49resultArea.Text += sWorkingText;   
 50break;   
 51case XmlNodeType.Comment: //注释   
 52++nCommen;   
 53break;   
 54case XmlNodeType.ProcessingInstruction: //处理指令   
 55++nPIs;   
 56break;   
 57case XmlNodeType.CDATA: //CDATA   
 58++nCDATAs;   
 59break;   
 60}   
 61}   
 62  
 63  
 64  
 65sWorkingText = "
 66" + "Total number of elements:" + nElements + "
 67";   
 68sWorkingText += "Total number of attributes in document:" + nAttributes + "
 69";   
 70sWorkingText += "Total comments:" + nComments + "
 71";   
 72sWorkingText += "Total processingInstructions:" + nPIs + "
 73";   
 74sWorkingText += "Total CDATA sections:" + nCDATAs;   
 75resultArea.Text += sWorkingText;   
 76}   
 77catch(XmlException exec)   
 78{   
 79sWorkingText = "Exception while parsing:" + "
 80";   
 81sWorkingText += "Line number:" + exec.LineNumber + "
 82";   
 83sWorkingText += "Message:" + exec.Message + "
 84" + "
 85";   
 86sWorkingText += "Line position:" + exec.LinePosition + "
 87";   
 88sWorkingText += "Stack Trace:" + "
 89" + exec.StackTrace;   
 90  
 91resultArea.Text = sWorkingText;   
 92}   
 93finally   
 94{   
 95if (myXmlDoc!=null)   
 96{   
 97  
 98myXmlDoc.Close();   
 99}   
100}   
101}   
102  
103//验证事件   
104public void ValidationEventCallBack(Object sender,ValidationEventArgs e)   
105{   
106if (e.Severity == XmlSeverityType.Warning)//区分是警告还是错误   
107{   
108resultArea.Text += "<b>Validation warning: </b>" + e.Message + "
109";   
110}   
111else   
112{   
113resultArea.Text += "<b>Validation errors: </b>" + e.Message + "
114";   
115}   
116}   
117</script>
 1<html>
 2<head><title>XmlTextReader</title></head>
 3<body>
 4<form method="post" runat="server">
 5<asp:label font-size="10pt" runat="server">上传XML文档 在服务器验证</asp:label>
 6<input id="fileSelector" runat="server" size="40" type="file"/> 
 7   
 8<asp:button id="uploadBtn" onclick="uploadBtn_Click" runat="server" text="提交"></asp:button>
 9<asp:label font-size="12pt" id="resultArea" runat="server"></asp:label>
10</form>
11</body>
12</html>

如果对实现功能有兴趣,可以翻阅相关的书或.Net Framework文档来熟悉XmlTextReader和XmlValidatingReader.

代码编写有不成熟的地方请多指教!谢谢!

Published At
Categories with Web编程
Tagged with
comments powered by Disqus