Validar um documento XML usando DTD, XDR ou XSD no Visual Basic

Este artigo mostra como usar a XmlValidatingReader classe para validar um documento XML em relação a um DTD, um esquema XDR ou um esquema XSD no Visual Basic 2005 ou no Visual Basic .NET. Também descreve como otimizar a validação por meio de esquemas de cache.

Versão original do produto: Visual Basic
Número de KB original: 315533

Resumo

Documentos de XML (Linguagem de Marcação Extensível) contêm elementos e atributos e fornecem uma maneira flexível e poderosa de trocar dados entre aplicativos e organizações. Para especificar a estrutura e o conteúdo permitidos de um documento XML, você pode escrever um DTD (Definição de Tipo de Documento), um esquema XDR (Microsoft XML-Data Reduced) ou um esquema XSD (linguagem de definição de esquema XML).

Esquemas XSD são a maneira preferida de especificar gramáticas XML no .NET Framework, mas DTDs e esquemas XDR também têm suporte.

Neste artigo, você aprenderá a aplicar um DTD, um esquema XDR ou um esquema XSD a um documento XML no Microsoft Visual Basic 2005 ou no Microsoft Visual Basic .NET. Em seguida, você aprenderá a usar a classe XmlValidatingReader para validar um documento XML na gramática especificada. Você também aprenderá a usar a classe XmlSchemaCollection para armazenar esquemas em cache na memória como uma forma de otimizar a validação XML.

Requisitos

A lista a seguir descreve o hardware, software, infraestrutura de rede e service packs recomendados que você precisa: Microsoft Visual Basic 2005 ou Microsoft Visual Basic .NET

Este artigo refere-se aos seguintes namespaces da Biblioteca de Classes da Microsoft .NET Framework:

  • System.Xml
  • System.Xml.Schema

Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:

  • Sintaxe do Visual Basic 2005 ou Visual Basic .NET
  • Conceitos XML, incluindo problemas de validação

Criar um documento XML

  1. Inicie o Microsoft Visual Studio 2005 ou o Microsoft Visual Studio .NET. Em seguida, crie um novo arquivo XML (no menu Arquivo, aponte para Novo e clique em Arquivo).

  2. Selecione o tipo arquivo XML e clique em Abrir.

  3. Adicione os seguintes dados ao documento XML para representar um produto em um catálogo:

    <Product ProductID="123">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  4. Salve o arquivo como Product.xml em uma pasta que você poderá acessar prontamente mais tarde (os exemplos de código neste artigo assumem uma pasta chamada C:\MyFolder).

  1. No Visual Studio 2005 ou no Visual Studio .NET, aponte para Novo no menu Arquivo e clique em Arquivo.

  2. Selecione o tipo Arquivo de Texto e clique em Abrir.

  3. Adicione as seguintes declarações DTD ao arquivo para descrever a gramática do documento XML:

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    
  4. Salve o arquivo como Product.dtd na mesma pasta que seu documento XML.

  5. Reabra Product.xml no Visual Studio 2005 ou no Visual Studio .NET; para fazer isso, aponte para Abrir no menu Arquivo e clique em Arquivo. Adicione uma instrução DOCTYPE (abaixo da linha), da ?xml version="1.0" seguinte maneira. Isso vincula o documento XML ao arquivo DTD).

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    
  6. Salve o documento XML modificado como ProductWithDTD.xml.

Executar a validação usando um DTD

  1. No Visual Studio 2005 ou no Visual Studio .NET, crie um novo projeto de Aplicativo de Console do Visual Basic chamado ValidateXmlUsingVB.

  2. O Visual Studio 2005 ou Visual Studio .NET exibe um novo arquivo chamado Module1.vb. No início deste arquivo, adicione duas instruções Imports, da seguinte maneira:

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. No Módulo1 (antes do início da sub-rotina principal), declare uma variável booliana chamada isValid, da seguinte maneira:

    'If a validation error occurs,
    ' you will set this flag to False 
    ' in the validation event handler. 
    Private isValid As Boolean = True
    
  4. Na sub-rotina Principal, crie um objeto XmlTextReader para ler um documento XML de um arquivo de texto. Em seguida, crie um XmlValidatingReader objeto para validar esses dados XML:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml")
    Dim v As New XmlValidatingReader(r)
    
  5. O objeto XmlValidatingReader tem uma propriedade ValidationType, que indica o tipo de validação necessária (DTD, XDR ou Schema). Defina essa propriedade como DTD, da seguinte maneira:

    v.ValidationType = ValidationType.DTD
    
  6. Se ocorrerem erros de validação, o leitor validador gerará um evento de validação. Adicione o código a seguir para registrar um manipulador de eventos de validação (você implementará a sub-rotina MyValidationEventHandler na etapa 8 desta seção):

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. Adicione o código a seguir para ler e validar o documento XML. Se ocorrerem erros de validação, MyValidationEventHandler será chamado para lidar com o erro. Essa sub-rotina será definida isValid como False (confira a etapa 8 desta seção). Você pode marcar o status de isValid após a validação para ver se o documento é válido ou inválido.

    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. Após a sub-rotina Principal, escreva a sub-rotina MyValidationEventHandler da seguinte maneira:

    Public Sub MyValidationEventHandler(ByVal sender As Object, _
     ByVal args As ValidationEventArgs)
         isValid = False
         Console.WriteLine("Validation event" & vbCrLf & args.Message)
    End Sub
    
  9. Crie e execute o aplicativo.

O aplicativo deve informar que o documento XML é válido. 10. No Visual Studio 2005 ou no Visual Studio .NET, modifique ProductWithDTD.xml para torná-lo inválido (por exemplo, exclua o elemento ProductName Rugby jersey/ ProductName ). 11. Execute o aplicativo novamente.

O aplicativo deve exibir a seguinte mensagem de erro:

O elemento de evento de validação 'Product' tem conteúdo incompleto. Esperado 'ProductName'. Ocorreu um erro em file:///C:/MyFolder/ProductWithDTD.xml(4, 3). O documento é inválido

  1. No Visual Studio 2005 ou no Visual Studio .NET, aponte para Novo no menu Arquivo e clique em Arquivo.

  2. Selecione o tipo Arquivo de Texto e clique em Abrir.

  3. Adicione as seguintes definições de esquema XDR ao arquivo para descrever a gramática do documento 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. Salve o arquivo como Product.xdr na mesma pasta que seu documento XML.

  5. Reabra o Product.xmloriginal e vincule-o ao esquema XDR da seguinte maneira:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. Salve o documento XML modificado como ProductWithXDR.xml.

Executar validação usando um esquema XDR

  1. Modifique seu aplicativo para que o XmlTextReader carregueProductWithXDR.xml, da seguinte maneira:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
    
  2. Defina o ValidationType como XDR para que o leitor validador execute a validação XDR da seguinte maneira:

    v.ValidationType = ValidationType.XDR
    
  3. Crie e execute o aplicativo.

    O aplicativo deve informar que o documento XML é válido.

  4. Modifique ProductWithXDR.xml para torná-lo deliberadamente inválido.

  5. Execute o aplicativo novamente.

    O aplicativo deve relatar um erro de validação.

  1. No Visual Studio .NET, aponte para Novo no menu Arquivo e clique em Arquivo.

  2. Selecione o tipo Arquivo de Texto e clique em Abrir.

  3. Adicione a seguinte definição de esquema XSD ao arquivo para descrever a gramática do documento 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. Salve o arquivo como Product.xsd na mesma pasta que seu documento XML.

  5. Reabra o Product.xmloriginal e vincule-o ao esquema XSD da seguinte maneira:

    <?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. Salve o documento XML modificado como ProductWithXSD.xml.

Executar validação usando um esquema XSD

  1. Modifique seu aplicativo para que o XmlTextReader carregamentoProductWithXSD.xml, da seguinte maneira:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
    
  2. Defina o ValidationType como Esquema para que o leitor validador execute a validação do esquema XSD, da seguinte maneira:

    v.ValidationType = ValidationType.Schema
    
  3. Crie e execute o aplicativo para validar o documento XML usando o esquema XSD.

    O aplicativo deve informar que o documento XML é válido.

Usar namespaces no esquema XSD

  1. No Visual Studio 2005 ou no Visual Studio .NET, abra ProductWithXSD.xml. Declare um namespace padrão, urn:MyNamespace, no documento. Modifique a vinculação XSD para especificar o esquema XSD para validar o conteúdo neste namespace, da seguinte maneira:

    <?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. Salve ProductWithXSD.xml.

  3. Abra Product.xsd, clique na guia XML e modifique a marca de início xsd:schema da seguinte maneira, para que o esquema se aplique ao namespace urn:MyNamespace:

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

  5. Execute o aplicativo para validar o documento XML usando o esquema XSD.

Namespaces de cache

  1. No Visual Studio 2005 ou no Visual Studio .NET, abra Module1.vb. No início da sub-rotina principal, crie um XmlSchemaCollection objeto da seguinte maneira:

    Dim cache As New XmlSchemaCollection()
    
  2. O XmlSchemaCollection objeto permite armazenar esquemas em cache na memória para melhorar o desempenho. Cada esquema está associado a um namespace diferente. Adicione o seguinte código para armazenar em cache Product.xsd:

    cache.Add("urn:MyNamespace", "C:\MyFolder\Product.xsd")
    
  3. Depois do código que cria o XmlValidatingReader objeto, adicione a instrução a seguir. Isso adiciona o cache de esquema ao , para XmlValidatingReader que o leitor possa usar os esquemas na memória.

    v.Schemas.Add(cache)
    

Verificação

  1. Crie e execute o aplicativo.
  2. Verifique se o documento XML ainda está sendo validado no esquema XSD.
  3. Faça algumas alterações no ProductWithXSD.xml para torná-lo deliberadamente inválido.
  4. Verifique se o aplicativo detecta esses erros de validação.