• XML 读取器和编写器读取XML 时应用验证


    如何在读取 XML 时应用验证

    此示例阐释如何在使用 XmlValidatingReader 类读取和分析 XML 数据时应用验证。验证是通过文档类型定义 (DTD) 或某个架构对 XML 内容强制应用规则的过程。简单地说,架构是 DTD 的 XML 表示形式,但它也可以推导出 XML 数据和类型信息中的关系。XmlValidatingReader 类在 XmlTextReader 上提供验证支持。

    注意:此示例是如何从文件读取 XML主题的继续。

     
    VB ValidationReadingXML.aspx

    [运行示例] | [查看源代码]

    当分析文档时,XmlValidatingReader 可提供对 DTD、XML 架构定义语言 (XSD) 架构或 XML 数据简化语言 (XDR) 架构的验证。可以使用 ValidationType 属性查询要使用哪些验证选项,如下表所示。

    验证类型 说明
    Auto 这是默认选项。
    None 不进行分析时验证。
    DTD 根据 DTD 进行验证。
    Schema 根据 XSD 架构进行验证。
    XDR 根据 XDR 架构进行验证。

    将 ValidationType 设置为 Auto 后将进行以下操作:

    • 如果没有 DTD 或架构,则将分析 XML 而不进行验证。
    • 如果在 <!DOCTYPE ...> 声明中定义了 DTD,则将加载 DTD 并处理 DTD 声明,以使默认属性和常规实体可用。只有使用(扩展)常规实体,才加载和分析它们。
    • 如果没有 <!DOCTYPE ...> 声明,但有 XSD“schemaLocation”属性,则将加载和处理这些 XSD 架构,并返回在这些架构中定义的所有默认属性。
    • 如果既没有 <!DOCTYPE ...> 声明,也没有 XSD 或 XDR 架构信息,则此分析器为非验证分析器(即 ValidationType=ValidationType.None)
    • 如果既没有 <!DOCTYPE ...> 声明,也没有 XSD“schemaLocation”属性,但有一些使用 MSXML“x-schema:”URN 前缀的命名空间,则将加载和处理这些架构,并返回在这些架构中定义的所有默认属性。
    • 如果没有 <!DOCTYPE ...> 声明,但有 <schema> 架构声明,则将使用内联架构进行验证。

    该示例代码(请参阅查看源文件)验证四个文件。用 books.dtd 验证第一个文件 BooksDTD.xml。用 books.dtd 验证第二个文件 BooksDTDFail.xml 失败。用 schema.xml 文件验证第三个文件 BooksSchema.xml。用 schema.xml 文件验证第四个文件 BooksFailSchema.xml 失败。Schema.xml 是一个 XSD 架构。该示例代码使用 DTD 或 Schema 的值来设置 ValidationType 属性,从而设置所需的验证类型,如以下的代码所示。

    XmlTextReader myXmlTextReader = new XmlTextReader(document1);
                XmlValidatingReader myXmlValidatingReader = new XmlValidatingReader(myXmlTextReader);
                myXmlValidatingReader.ValidationType = ValidationType.DTD;
                
    C# VB  

    分析器不会因任何类型的验证错误而停止,它只在发现格式错误的数据时停止。由于分析器不会因验证错误而停止,您就可以在一次分析过程中找出所有验证错误,而不必反复地分析 XML 文档。

    如下列代码所示,一个验证错误导致该示例在读取 XML 文档前,调用由 ValidationEventHandler 类设置的处理程序方法。如果没有提供该方法,则在遇到第一个验证错误时,XmlValidatingReader 将引发一个 XmlSchemaException。在此代码示例中,success 变量指示验证状态。

    分析器不会因任何类型的验证错误而停止,它只在发现格式错误的数据时停止。由于分析器不会因验证错误而停止,您就可以在一次分析过程中找出所有验证错误,而不必反复地分析 XML 文档。

    private void Validate()
                {
                try
                {
                // Set the validation event handler
                myXmlValidatingReader.ValidationEventHandler += new ValidationEventHandler (this.ValidationEventHandle);
                // Read XML data
                while (myXmlValidatingReader.Read()){}
                Console.WriteLine ("Validation finished. Validation {0}", (Success==true ? "successful" : "failed"));
                }
                catch (XmlException e)
                {
                Console.WriteLine ("XmlException: " + e.ToString());
                }
                catch (Exception e)
                {
                Console.WriteLine ("Exception: " + e.ToString());
                }
                }
                public void ValidationEventHandle (object sender, ValidationEventArgs args)
                {
                Console.Write("\r\n\tValidation error: " + args.Message);
                }
                
    C# VB  

    您可以使用回调处理程序确保 XmlSeverityType 枚举根据架构来验证 XML 实例文档。对于所有的验证错误,有一个 XmlSeverityType.Error 值,它表示一个致命错误。然而,可能完全没有可用于验证元素和属性的架构信息。在这种情况下(通常具有 ErrorCodes、NoElementSchemaFound 和 NoAttributeSchemaFound 值)XmlSeverityType 的值为 XmlSeverityType.Warning。

    摘要

    1. 可根据 DTD、XSD 或 XDR 架构进行验证,所需验证类型由 Validation 属性设置。
    2. 在读取和分析操作的过程执行验证。
    3. ValidationEventHandler 属性必须设置为接收验证错误通知。
    4. 验证错误不会使分析停止。只有出现格式错误时,分析才会停止。这使您可以在一次分析过程中发现所有错误。
  • 相关阅读:
    iOS UITableView的cell重用标识
    iOS SDWebImage清理缓存数据
    iOS UITextView 根据输入text自适应高度
    iOS 网络请求 NSURLSession 的上传文件方法
    iOS开发之tintColor属性详解
    iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置
    iOS9 Xcode7 设置Launch Image 启动图片
    iOS
    iOS 浅谈AFNetworking网络请求
    贝塞尔曲线
  • 原文地址:https://www.cnblogs.com/chorrysky/p/584474.html
Copyright © 2020-2023  润新知