在XmlReaderSettings类中,Schemas属性表示为一个集合—— 即XmlSchemaSet类的实例,允许将打算用于之后验证的一个或多个模式保存起来。使用模式集合可以提高整体性能,因为各种模式都保存在内存中而不需要在每次验证的时候进行加载。可以按需要添加任意多个XSD模式,但是请记住在第一次调用Read之前,集合必须完成。
为了添加一个新的模式至缓存,可以使用XmlSchemaSet对象的Add()方法。该方法具有一些重载形式,如下所示:
public void Add(XmlSchemaSet);
public XmlSchema Add(XmlSchema);
public XmlSchema Add(string, string);
public XmlSchema Add(string, XmlReader);
第一个重载将所有定义于给定集合中的模式填充至当前集合中。余下的3个重载由不同数据建立并返回XmlSchema类的实例—— 包含XSD模式定义的.NET Framework类。
1. 填充模式集合
模式集合实际上由XmlSchema类的实例组成—— 一种模式编译后的版本类型。Add方法的不同重载允许以不同的输入参数创建XmlSchema对象。例如,考虑如下方法:
public XmlSchema Add(string ns, string url);
这个方法创建并添加了一个新的模式对象至集合中。使用与模式相关联的命名空间URI和源的URL来创建编译后的模式对象。
可以使用Contains()方法检查一个模式是否已经在模式集合中。Contains()方法可以接受一个XmlSchema对象,也可以接受一个表示与模式相关联的命名空间URI的字符串。前面的方式只用于XSD模式。而后面的方式则可用于XSD和XDR模式。
2. 使用XmlSchemaSet类验证XML数据
XmlSchemaSet类表示XML模式的缓存。它允许您为相同的目标命名空间将多个模式编译成单个逻辑模式。
注意:
XmlSchemaSet类代替了XmlSchemaCollection类,后者是在.NET Framework 1.x中将模式放入缓存所选择的类。新的XmlSchemaSet类不仅提供了更好的标准兼容性而且还提高了性能。
在查看示例之前,先简要介绍一下XmlSchemaSet类的重要属性和方法。表5-4提供了XmlSchemaSet类中重要属性的列表。
表5-4 XmlSchemaSet类的重要属性
属 性 |
说 明 |
Count |
获得包含在XmlSchemaSet中的逻辑XSD模式数量 |
GlobalAttributes |
获得对包含在XmlSchemaSet中所有的XSD模式的所有全局属性的引用 |
GlobalElements |
获得对包含在XmlSchemaSet中所有的XSD模式的所有全局元素的引用 |
GlobalTypes |
获得包含在XmlSchemaSet中的所有XSD模式的所有全局简单和复杂的类型 |
IsCompiled |
指示在XmlSchemaSet中的XSD模式是否已经被编译 |
表5-5讨论了XmlSchemaSet类的重要方法。
表5-5 XmlSchemaSet类的重要方法
方 法 |
说 明 |
Add |
将给定的XSD模式添加至XmlSchemaSet |
Compile |
将添加至XmlSchemaSet类的XSD模式编译成单个逻辑模式,然后用于验证 |
Contains |
允许您检查所提供的XSD模式是否在XmlSchemaSet之中 |
Remove |
从XmlSchemaSet中移除指定的XSD模式 |
Reprocess |
重新处理已经存在于XmlSchemaSet之中的XSD模式 |
程序清单5-4中的示例显示了如何利用XmlSchemaSet类来验证XML数据。
程序清单5-4 使用XmlSchemaSet类验证XML数据
<%@ Page Language="C#"%>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.Schema" %>
<script runat="server">
private StringBuilder _builder = new StringBuilder();
void Page_Load(object sender, EventArgs e)
{
string xmlPath = Request.PhysicalApplicationPath +
@""App_Data"Authors.xml";
string xsdPath = Request.PhysicalApplicationPath +
@""App_Data"Authors.xsd";
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, xsdPath);
XmlReader reader = null;
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationEventHandler += new
ValidationEventHandler(this.ValidationEventHandler);
settings.ValidationType = ValidationType.Schema;
settings.Schemas = schemaSet;
reader = XmlReader.Create(xmlPath, settings);
while (reader.Read())
{
}
if (_builder.ToString() == String.Empty)
Response.Write("Validation completed successfully.");
else
Response.Write("Validation Failed. <br>" + _builder.ToString());
}
void ValidationEventHandler(object sender, ValidationEventArgs args)
{
_builder.Append("Validation error: " + args.Message + "<br>");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>XSD Validation using XmlSchemaSet</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
在程序清单5-4中,当创建完XmlSchemaSet类的实例之后,就调用Add方法将Authors.xsd模式添加至XmlSchemaSet类。
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, xsdPath);
当把这个模式添加至XmlSchemaSet之后,只要将XmlReaderSettings对象的Schemas属性设置为XmlSchemaSet对象。
settings.Schemas = schemaSet;
然后在循环中调用XmlReader对象的Read方法来分析XML数据。与前面的示例类似的是,解析器只在XML数据不是格式良好的时候才停止。因为在出现验证错误时并不停止,所以就可以在一个过程中找到所有的验证错误而无需反复分析XML文档。如果使用浏览器浏览这个页面,将会看到与图5-1显示相同的输出。