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