开发环境:VS2008
在.NET中说到验证XML,估计不少人会想到用类XmlValidatingReader,谁知在.NET2.0时此类已标记为已过时,取而代之的是XmlReaderSettings类,
此类其实很简单,使用时只需设置少数属性。
验证过程中代码相对简单,主要是有一些细节需要注意。
下面先介绍XmlReaderSettings类用到的两个属性
Schemas | 获取或设置在执行架构验证时使用的 XmlSchemaSet。 |
ValidationType | 获取或设置一个值,该值指示 XmlReader 在读取时是否执行验证或类型分配。 |
<?xml version="1.0" encoding="utf-8" ?> <!-- 注意默认命名空间,当XSD上有属性targetNamespace时, 此默认命名空间是必要的,而且必须和targetNamespace的值一样 --> <book xmlns="http://www.cnblogs.com/lucas/"> <title>书名</title> <price>12.99</price> </book>
<?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>
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 />"; } }
1. 验证XML文档的步骤
(1) 定义一个ValidationEventHandler事件处理程序方法。
(2) 创建XmlReaderSettings对象的实例。XmlReaderSettings类允许指定一套由XmlReader对象支持的选项,并且这些选项将会在解析XML数据的时候起作用。请注意XmlReaderSettings生成废弃的XmlValidatingReader类(用于.NET 1.x版本)。
(3) 将前面定义好的ValidationEventHandler方法与XmlReaderSettings类相关联。
(4) 将XmlReaderSettings的ValidationType属性设置为ValidationType.Schema。
(5) 通过XmlReaderSettings类的Schema属性将XSD模式添加至XmlReaderSettings类。
(6) 在解析XML数据的时候,XmlReader类使用Read方法验证XML文档。
验证事件处理程序
ValidationEventHandler事件定义了一个事件处理程序,用于接收关于XSD模式验证错误的通知。验证的错误和警告通过ValidationEventHandler回调函数来报告。验证错误不会停止解析,解析只会在XML文档不是格式良好时停止。但是,如果您没有提供验证事件处理程序的回调函数并且发生了验证错误,将会抛出异常。使用验证事件回调机制捕获所有验证错误的这种方式可以在单步过程中发现所有的验证错误。
XML验证中XmlReaderSettings类的角色
XmlReaderSettings类和XmlReader类一样是最重要的类之一,它提供了验证XML数据的核心基础。表5-1提供了XmlReaderSettings类中验证相关属性的简要描述,本章后部分将会利用这些属性。
表5-1 验证X mlReaderSettings类的相关属性和事件
属 性 | 说 明 |
ProhibitDtd | 指示XmlReaderSettings类是否支持DTD验证。默认值是true,表示不支持DTD验证 |
ValidationType | 指定XmlReaderSettings类支持的验证类型。允许的验证类型是DTD、XSD和None |
ValidationEventHandler | 指定事件处理程序,用于接收关于验证事件的信息 |
ValidationFlags | 指定在验证XML数据时将被强制执行的附加的验证设置,如使用内嵌模式、身份约束和XML属性 |
Schemas | 获得或者设置XmlSchemaSet对象,该对象表示用于执行模式验证的模式集合 |
为了能够使用XmlReaderSettings类来验证XML数据,必须将XmlReaderSettings类的属性设置为正确的值。这个类本身无法运行,而需要与XmlReader或者XmlNodeReader实例一同运行。您可以使用这个类并依据DTD或XML模式进行验证。
3. 处理XML验证中的异常
在程序清单5-3中,只要出现了XML验证错误,控制就会自动转向ValidationEventHandler方法,来处理异常并将验证错误消息(通过ValidationEventArgs对象的Message属性获得)添加至StringBuilder对象。如果StringBuilder对象包含了所有消息,最后这个错误消息将会显示给用户。虽然这对本示例来说已经足够,但是很多时候您会想要区分不同的异常类型,如在验证过程中产生的警告或者错误。为了达到这个目的,可以检查ValidationEventArgs对象的Severity属性。这个属性返回XmlSeverityType类的枚举,可用于判断产生的异常类型。表5-3显示了这个枚举所包含的值。
表5-3 XmlSeverityType枚举值
值 | 描 述 |
Error | 指示在验证实例文档时出现了验证错误。这可以是使用DTD和XSD模式的验证结果。如果没有验证事件处理程序来处理这种情况,将会抛出异常 |
Warning | 指示验证解析器已经运行到一个没有错误但是有必要警告用户的情况之下。Warning和Error的不同之处是它不会在调用方法的应用程序中抛出异常 |