此示例阐释如何在使用 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 后将进行以下操作:
该示例代码(请参阅查看源文件)验证四个文件。用 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; Dim myXmlTextReader As XmlTextReader = New XmlTextReader(document1) Dim myXmlValidatingReader As XmlValidatingReader = 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); } private sub Validate() try ' Set the validation event handler Dim valdel as ValidationEventHandler = new ValidationEventHandler(addressof ValidationEvent) AddHandler myXmlValidatingReader.ValidationEventHandler, valdel ' Read XML data while myXmlValidatingReader.Read() end While Dim s as String if (success = true) s = "successful" else s = "failed" end if Console.WriteLine ("Validation finished. Validation {0}", s) catch e as XmlException Console.WriteLine ("XmlException: {0} ", e.ToString()) catch e as Exception Console.WriteLine ("Exception: {0} ", e.ToString()) end try end sub public sub ValidationEvent (errorid as object, args as ValidationEventArgs) Console.Write(Strings.chr(9) & "Validation error: " & args.Message) end sub |
||
C# | VB |
您可以使用回调处理程序确保 XmlSeverityType 枚举根据架构来验证 XML 实例文档。对于所有的验证错误,有一个 XmlSeverityType.Error 值,它表示一个致命错误。然而,可能完全没有可用于验证元素和属性的架构信息。在这种情况下(通常具有 ErrorCodes、NoElementSchemaFound 和 NoAttributeSchemaFound 值)XmlSeverityType 的值为 XmlSeverityType.Warning。