使用Asp.Net中的XmlValidatingReader來驗證XML Schema.
2024-07-10 12:57:55
供稿:網(wǎng)友
 
網(wǎng)站運營seo文章大全提供全面的站長運營經(jīng)驗及seo技術(shù)!這段時間,我正在學(xué)習(xí)xml,書上介紹使用xerces-c或xerces-j來驗證xml文檔的schema或dtd,結(jié)果,發(fā)現(xiàn)上面的工具不好用.
后來,只有放下書,到書店看看,有沒有其他什么書能帶來幫助.當(dāng)檢到professiona asp.net xml with c# 這本書時,里面講到了使用system.xml 和 system.xml.schema命名空間下的xmltextreader類和xmlvalidatingreader類來驗證帶有schema或dtd的xml文檔.便買下來了.
回寢室后,根據(jù)書里面面的介紹,寫了一個小的測試程序,發(fā)現(xiàn)還很管用,在這里,但貼出來,希望給需要的人有幫助.
代碼如下:
<%@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; //統(tǒng)計文檔中element的個數(shù)
 int nattributes = 0; //統(tǒng)計文檔中attributes的個數(shù)
 int ncomments = 0; //統(tǒng)計文檔中 comment的個數(shù)
 int npis = 0; //統(tǒng)計文檔中processinginstruction的個數(shù)
 int ncdatas = 0; //統(tǒng)計文檔中cdata的個數(shù)
 
 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將根據(jù)schema或dtd
 //對xml進行驗證。
 while(myxmldoc.read())
 {
 //這里面的語句的作用主要是分析xml文檔各node,
 //但while循環(huán)還是必要,因為只有逐個遍歷所有個的node,才會檢查出驗證是否匹配。
 
 switch(myxmldoc.nodetype) //judge crrent node's type. 判定當(dāng)前結(jié)點的類型
 {
 case xmlnodetype.element : // element 元素
 ++nelements;
 nattributes += myxmldoc.attributecount;
 break;
 case xmlnodetype.text : //文本內(nèi)容
 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();
 }
 }
 }
 
 //驗證事件
 public void validationeventcallback(object sender,validationeventargs e)
 {
 if (e.severity == xmlseveritytype.warning)//區(qū)分是警告還是錯誤
 {
 resultarea.text += "<b>validation warning: </b>" + e.message + "<br/>";
 }
 else
 {
 resultarea.text += "<b>validation errors: </b>" + e.message + "<br/>";
 }
 }
</script>
<html>
 <head><title>xmltextreader</title></head>
 <body>
 <form method="post" runat="server">
 <asp:label font-size="10pt" runat="server">上傳xml文檔 在服務(wù)器驗證</asp:label><br/>
 <input type="file" size="40" runat="server" id="fileselector"> <br/>
 <asp:button id="uploadbtn" text="提交" onclick="uploadbtn_click" runat="server"/><br/>
 <asp:label font-size="12pt" id="resultarea" runat="server"/><br/>
 
 </form>
 </body>
</html>