开发环境:VS2008
在.NET中说到验证XML,估计不少人会想到用类XmlValidatingReader,谁知在.NET2.0时此类已标记为已过时,取而代之的是XmlReaderSettings类,
此类其实很简单,使用时只需设置少数属性。
验证过程中代码相对简单,主要是有一些细节需要注意。
下面先介绍XmlReaderSettings类用到的两个属性
建立book.xml和book.xsd如下
![](/Images/OutliningIndicators/ContractedBlock.gif)
book.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--
注意默认命名空间,当XSD上有属性targetNamespace时,
此默认命名空间是必要的,而且必须和targetNamespace的值一样
-->
<book xmlns="http://www.cnblogs.com/lucas/">
<title>书名</title>
<price>12.99</price>
</book>
![](/Images/OutliningIndicators/ContractedBlock.gif)
book.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="book"
targetNamespace="http://www.cnblogs.com/lucas/"
elementFormDefault="qualified"
xmlns="http://tempuri.org/book.xsd"
xmlns:mstns="http://tempuri.org/book.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Default.aspx页面的代码
![](/Images/OutliningIndicators/ContractedBlock.gif)
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal ID="ltlMsg" runat="server"></asp:Literal>
</div>
</form>
</body>
</html>
![](/Images/OutliningIndicators/ContractedBlock.gif)
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlReaderSettings settings = new XmlReaderSettings();
//验证类型设置为模式(xsd)
settings.ValidationType = ValidationType.Schema;
//为XmlReaderSettings对象添加模式
//第一个参数是targetNamespace的值,null表示采用XSD文件里targetNamespace属性的值
//如果要明确传递此参数,务必与targetNamespace的值一致
//第二个参数一定要采用绝对路径或物理路径,不能采用相对路径
settings.Schemas.Add(null, Server.MapPath("book.xsd"));
//添加验证错误的处理事件
settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);
//同理第一个参数必须是绝对路径或物理路径
XmlReader reader = XmlReader.Create(Server.MapPath("book.xml"), settings);
while (reader.Read())
{
}
reader.Close();
this.ltlMsg.Text += "End
";
}
void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
{
this.ltlMsg.Text += e.Message + "<br />";
}
}
此程序可正确验证,自己尝试时不妨修改XML或XSD的内容,然后再运行程序看看结果。
完整程序下载