如何在读取 XML 时应用验证
此示例阐释如何在使用 XmlValidatingReader 类读取和分析 XML 数据时应用验证。验证是通过文档类型定义 (DTD) 或某个架构对 XML 内容强制应用规则的过程。简单地说,架构是 DTD 的 XML 表示形式,但它也可以推导出 XML 数据和类型信息中的关系。XmlValidatingReader 类在 XmlTextReader 上提供验证支持。
注意:此示例是如何从文件读取 XML主题的继续。
![]()
[运行示例] | [查看源代码] |
当分析文档时,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。
摘要
- 可根据 DTD、XSD 或 XDR 架构进行验证,所需验证类型由 Validation 属性设置。
- 在读取和分析操作的过程执行验证。
- ValidationEventHandler 属性必须设置为接收验证错误通知。
- 验证错误不会使分析停止。只有出现格式错误时,分析才会停止。这使您可以在一次分析过程中发现所有错误。