zoukankan      html  css  js  c++  java
  • 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显示相同的输出。

  • 相关阅读:
    hdu 4476 Cut the rope (2-pointer && simulation)
    hdu 1286 找新朋友 (容斥原理 || 欧拉函数)
    函数存储的另一种思路
    grunt 入门 应用grunt对代码进行压缩
    sublime flatLand 主题
    如何应用r.js对requirejs下的js代码合并
    如何在requirejs下引用bootstrap
    学习在requirejs下如何使用underscore.js模板
    应用js函数柯里化currying 与ajax 局部刷新dom
    js 函数arguments一种用法
  • 原文地址:https://www.cnblogs.com/millen/p/1393418.html
Copyright © 2011-2022 走看看