.Net学习爱好者的温馨家园

.Net互动平台

导航

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. 验证错误不会使分析停止。只有出现格式错误时,分析才会停止。这使您可以在一次分析过程中发现所有错误。

posted on 2006-12-06 19:07  Xt Idt  阅读(491)  评论(0编辑  收藏  举报