XML校验学习之二

    在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模式。而后面的方式则可用于XSDXDR模式。

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显示相同的输出。

posted @ 2009-02-18 19:03  catch22  阅读(644)  评论(0编辑  收藏  举报