在 Visual Basic 中使用 DTD、XDR 或 XSD 验证 XML 文档

本文介绍如何使用 XmlValidatingReader 该类针对 VISUAL Basic 2005 或 Visual Basic .NET 中的 DTD、XDR 架构或 XSD 架构验证 XML 文档。 此外,还介绍如何通过缓存架构来优化验证。

原始产品版本: Visual Basic
原始 KB 数: 315533

总结

可扩展标记语言(XML)文档包含元素和属性,并提供一种灵活而强大的方法来在应用程序和组织之间交换数据。 若要指定 XML 文档的允许结构和内容,可以编写文档类型定义(DTD)、Microsoft XML 数据减少(XDR)架构或 XML 架构定义语言(XSD)架构。

XSD 架构是指定 .NET Framework 中的 XML 语法的首选方法,但也支持 DTD 和 XDR 架构。

本文介绍如何将 DTD、XDR 架构或 XSD 架构应用于 Microsoft Visual Basic 2005 或 Microsoft Visual Basic .NET 中的 XML 文档。 然后,你将了解如何使用 XmlValidatingReader 类根据指定的语法验证 XML 文档。 你还将了解如何使用 XmlSchemaCollection 类将内存中的架构缓存为优化 XML 验证的方法。

要求

以下列表概述了所需的推荐硬件、软件、网络基础结构和服务包:Microsoft Visual Basic 2005 或 Microsoft Visual Basic .NET

本文介绍以下Microsoft .NET Framework 类库命名空间:

  • System.Xml
  • System.Xml.Schema

本文假定你熟悉以下主题:

  • Visual Basic 2005 或 Visual Basic .NET 语法
  • XML 概念,包括验证问题

创建 XML 文档

  1. 开始Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET。 然后,创建新的 XML 文件(在“文件”菜单上,指向 “新建”,然后单击“文件”)。

  2. 选择 XML 文件类型,然后单击“ 打开”。

  3. 将以下数据添加到 XML 文档,以表示目录中的产品:

    <Product ProductID="123">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  4. 将文件保存为 Product.xml, 稍后你将能够轻松访问(本文中的代码示例假定名为 C:\MyFolder文件夹)。

  1. 在 Visual Studio 2005 或 Visual Studio .NET 中,指向“文件”菜单上的“新建”,然后单击“文件”。

  2. 选择“文本文件”类型,然后单击“ 打开”。

  3. 将以下 DTD 声明添加到文件中,以描述 XML 文档的语法:

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    
  4. 将文件另存为 Product.dtd ,并将其保存在 XML 文档所在的同一文件夹中。

  5. 在 Visual Studio 2005 或 Visual Studio .NET 中重新打开 Product.xml ;为此,请在“文件”菜单上指向“打开”,然后单击“ 文件”。 添加 DOCTYPE 语句(行 ?xml version="1.0" 下方),如下所示。 这会将 XML 文档链接到 DTD 文件。

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    
  6. 将修改后的 XML 文档另存为 ProductWithDTD.xml

使用 DTD 执行验证

  1. 在 Visual Studio 2005 或 Visual Studio .NET 中,创建名为 ValidateXmlUsingVB 的新 Visual Basic 控制台应用程序项目。

  2. Visual Studio 2005 或 Visual Studio .NET 显示名为 Module1.vb的新文件。 在此文件的开头,添加两个 Imports 语句,如下所示:

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. 在 Module1(在 Main 子例程的开头之前),声明名为 isValid 的布尔变量,如下所示:

    'If a validation error occurs,
    ' you will set this flag to False 
    ' in the validation event handler. 
    Private isValid As Boolean = True
    
  4. 在 Main 子例程中,创建一个 XmlTextReader 对象,以从文本文件中读取 XML 文档。 然后,创建一个 XmlValidatingReader 对象来验证此 XML 数据:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml")
    Dim v As New XmlValidatingReader(r)
    
  5. XmlValidatingReader 对象具有 ValidationType 属性,该属性指示所需的验证类型(DTD、XDR 或架构)。 将此属性设置为 DTD,如下所示:

    v.ValidationType = ValidationType.DTD
    
  6. 如果发生任何验证错误,验证读取器将生成验证事件。 添加以下代码来注册验证事件处理程序(在本部分的步骤 8 中实现 MyValidationEventHandler 子例程):

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. 添加以下代码以读取和验证 XML 文档。 如果发生任何验证错误,将调用 MyValidationEventHandler 来处理错误。 此子例程将设置为 isValid False (请参阅本部分的步骤 8)。 可以在验证后检查 isValid 的状态,以查看文档是否有效或无效。

    While v.Read()' Could add code here to process the content.
    End While
    v.Close()' Check whether the document is valid or invalid.
    If isValid Then
        Console.WriteLine("Document is valid")
    Else
        Console.WriteLine("Document is invalid")
    End If
    
  8. 在 Main 子例程之后,编写 MyValidationEventHandler 子例程,如下所示:

    Public Sub MyValidationEventHandler(ByVal sender As Object, _
     ByVal args As ValidationEventArgs)
         isValid = False
         Console.WriteLine("Validation event" & vbCrLf & args.Message)
    End Sub
    
  9. 生成并运行应用程序。

应用程序应报告 XML 文档是否有效。 10. 在 Visual Studio 2005 或 Visual Studio .NET 中,修改ProductWithDTD.xml使其无效(例如,删除 ProductName 橄榄球衣/ ProductName 元素)。 11. 再次运行应用程序。

应用程序应显示以下错误消息:

Validation 事件元素“Product”的内容不完整。 应为“ProductName”。 file:///C:/MyFolder/ProductWithDTD.xml(4,3)发生错误。 文档无效

  1. 在 Visual Studio 2005 或 Visual Studio .NET 中,指向“文件”菜单上的“新建”,然后单击“文件”。

  2. 选择“文本文件”类型,然后单击“ 打开”。

  3. 将以下 XDR 架构定义添加到文件中,以描述 XML 文档的语法:

    <?xml version="1.0"?>
    <Schema name="ProductSchema" 
     xmlns="urn:schemas-microsoft-com:xml-data"
     xmlns:dt="urn:schemas-microsoft-com:datatypes">
    
        <AttributeType name="ProductID" dt:type="int"/>
        <ElementType name="ProductName" dt:type="string"/>
    
        <ElementType name="Product" content="eltOnly">
            <attribute type="ProductID" required="yes"/>
            <element type="ProductName"/>
        </ElementType>
    </Schema>
    
  4. 将文件另存为 Product.xdr ,并将其保存在 XML 文档所在的同一文件夹中。

  5. 重新打开原始 Product.xml,然后将其链接到 XDR 架构,如下所示:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. 将修改后的 XML 文档另存为 ProductWithXDR.xml

使用 XDR 架构执行验证

  1. 修改应用程序,使 XmlTextReader 加载 ProductWithXDR.xml,如下所示:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
    
  2. ValidationType 设置为 XDR,使验证读取器执行 XDR 验证,如下所示:

    v.ValidationType = ValidationType.XDR
    
  3. 生成并运行应用程序。

    应用程序应报告 XML 文档是否有效。

  4. 修改 ProductWithXDR.xml 使其故意无效。

  5. 再次运行应用程序。

    应用程序应报告验证错误。

  1. 在 Visual Studio .NET 中,指向“文件”菜单上的“新建”,然后单击“文件”。

  2. 选择“文本文件”类型,然后单击“ 打开”。

  3. 将以下 XSD 架构定义添加到文件中,以描述 XML 文档的语法:

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="Product">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="ProductName" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="ProductID" use="required" type="xsd:int"/>
        </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    
  4. 将文件另存为 Product.xsd,并将其保存在 XML 文档所在的同一文件夹中。

  5. 重新打开原始 Product.xml,然后将其链接到 XSD 架构,如下所示:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. 将修改后的 XML 文档另存为 ProductWithXSD.xml

使用 XSD 架构执行验证

  1. 修改应用程序,使 XmlTextReader 加载 ProductWithXSD.xml,如下所示:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
    
  2. ValidationType 架构设置为“架构”,使验证读取器执行 XSD 架构验证,如下所示:

    v.ValidationType = ValidationType.Schema
    
  3. 使用 XSD 架构生成并运行应用程序以验证 XML 文档。

    应用程序应报告 XML 文档是否有效。

在 XSD 架构中使用命名空间

  1. 在 Visual Studio 2005 或 Visual Studio .NET 中,打开 ProductWithXSD.xml。 在文档中声明默认命名空间 urn:MyNamespace。 修改 XSD 链接以指定 XSD 架构以验证此命名空间中的内容,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:MyNamespace"
     xsi:schemaLocation="urn:MyNamespace Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  2. 保存 ProductWithXSD.xml

  3. 打开 Product.xsd,单击 XML 选项卡,然后按如下所示修改 xsd:schema start 标记,以便架构应用于命名空间 urn:MyNamespace

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="urn:MyNamespace"
     elementFormDefault="qualified">
    
  4. 保存 Product.xsd

  5. 运行应用程序以使用 XSD 架构验证 XML 文档。

缓存命名空间

  1. 在 Visual Studio 2005 或 Visual Studio .NET 中,打开Module1.vb。 在 Main 子例程开始时,创建一个 XmlSchemaCollection 对象,如下所示:

    Dim cache As New XmlSchemaCollection()
    
  2. XmlSchemaCollection 对象允许在内存中缓存架构以提高性能。 每个架构都与不同的命名空间相关联。 添加以下代码以缓存 Product.xsd

    cache.Add("urn:MyNamespace", "C:\MyFolder\Product.xsd")
    
  3. 创建 XmlValidatingReader 对象的代码后,添加以下语句。 这会将架构缓存添加到 <a0/>,以便读取器可以使用内存中架构。

    v.Schemas.Add(cache)
    

验证

  1. 生成并运行应用程序。
  2. 验证 XML 文档是否仍在针对 XSD 架构进行验证。
  3. 对ProductWithXSD.xml进行一些更改,以故意使其无效。
  4. 验证应用程序是否检测到这些验证错误。