这段时间,我正在学习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.
代码编写有不成熟的地方请多指教!谢谢!