VB. NET 2005 - Validando um documento XML com XSD


Existem uma variedade de métodos para validar um documento XML, incluindo DTD e esquemas de definição externos e internos. Se você estiver lendo o documento XML em um objeto System.Xml.Document poderá efetuar a verificação usando qualquer destes métodos de validação.

Para saber mais sobre XML leia os artigos:

Não devemos confundir métodos para validar um documento XML com esquemas usados para esta finalidade. Atualmente existem três tipos de schemas usados para validar XML: DTD (Document Type Definition), XDR Schemas (XML-Data Reduced) e XSD Schemas (XML-Schema Definition)
  • DTD – Método inicial de validação de XML descrito no W3C XML (www.w3.org/). A recomendação atual concedida ao XSD tornou os DTD obsoletos.
  • XDR – Tecnologia criada pela Microsoft. similar ao XSD. Tem a vantagem de ter sido escrito usando XML.
  • XSD – É e recomendação atual do W3C. Substitui os DTDs e os XRDs da Microsoft.

Normalmente o método XmlReader lê qualquer arquivo XML válido em um objeto XmlDocument sem efetuar validação, porém , você pode indicar o tipo de validação a ser realizada definindo as propriedades de um objeto XmlReaderSettings e usando quando criar o objeto XmlReader.

Nota: Para saber mais veja o meu artigo : Usando XMLReader

A seguir o código básico usado para processar XML contido na variável xmArquivo

' ----- XML contido na variável 'xmlArquivo'
Dim LeConteudo As Xml.XmlReader
Dim xmlConteudo As Xml.XmlDocument
Dim customSettings As New Xml.XmlReaderSettings

' ----- Modifica as propriedades
LeConteudo = Xml.XmlReader.Create(xmlArquivo, customSettings)
xmlConteudo = New Xml.XmlDocument
xmlConteudo.Load(LeConteudo)

O código que irá ser usado para modificar as propriedades customSettings depende do tipo de verificação ou processamento que deseja realizar. Para validar um XMl usando um arquivo de esquema externo conhecido (arquivo .xsd) use o seguinte código:

customSettings.ValidationType = Xml.ValidationType.Schema
customSettings.Schemas.Add("urn:meu-schema", "Esquema.xsd")


O método Create usa a classe XmlReaderSettings para definir quais recursos serão implementados no objeto XmlReader criado.

A classe XmlReaderSettings inclui características que controla o processamento do conteúdo XML durante a sua leitura, incluindo a manipulação de espaços, comentários embutidos e como a validação será tratada através da propriedade ValidationType.

No VB 2005 as definições permitidas para ValidationType são:

Nota: O que é um Schema ?

Um schema é uma estrutura, e, o documento ou dado que é representando pelo Schema é chamado instância do Documento.

O que XSD ?

O XSD fornece a sintaxe que define a forma na qual elementos e atributos podem ser representados em um arquivo XML.

Tenha cuidado ao realizar validação DTD pois entradas DTD mal formadas podem causar problemas no processamento , por este motivo o processamento DTD esta desabilitado por padrão. Para ativar o processamento DTD você poderá usar o seguinte código:

customSettings.ValidationType = Xml.ValidationType.DTD
customSettings.ProhibitDtd = False

Se o seu documento XML incluir esquema XSD (schema inline) você deverá ativar o suporte ao processamento da seguinte forma:

customSettings.ValidationType = Xml.ValidationType.Schema
customSettings.ValidationFlags = customSettings.ValidationFlags Or Xml.Schema.XmlSchemaValidationFlags.ProcessInlineSchema


Quando você for validar um documento XML qualquer conteúdo que se desvie do esquema irá disparar exceções ( System.Xml.XmlException0 que tem origem da chamada a XmlDocument.Load()

Além disso você também pode capturar exceções através do evento ValidationEventHandler da classe XmlReaderSettings.

Resumindo: Os passos necessários para validar um arquivo XML usando XmlReaderSettings:

  1. Criar um objeto XmlSchema usando um arquivo de esquema;
  2. Criar um objeto XmlReaderSettings;
  3. Definir a propriedade ValidationType do do XmlReaderSettings como "Schema";
  4. Incluir o XmlSchema para a coleção de schemas de XmlReaderSettings;
  5. Anexar o evento para XmlReaderSettings.ValidationEventHandler;
  6. Criar uma instância do XmlReader usando XmlReader.Create() e passar o arquivo XML para validar;
  7. Ler o arquivo XML;

Então agora vamos mostrar como fazer a validação de um arquivo XML usando um Schema XSD.

Primeiro vamos criar um arquivo chamado Clientes.xml. No menu Project clique na opção Add New Item ,e, na janela selecione o template Text File (Se você estiver usando o VS 2005 deverá selecionar o template XML File) e salve o arquivo com o nome Clientes.xml:

A seguir digite os seguintes dados no documento XML para representar um produto com nome e código:

<?xml version="1.0"?>
<clientes>
	<cliente id="1" estado="ativo">
		<nome>Macoratti</nome>
		<email>macoratti@yahoo.com</email>
	</cliente>
	<cliente id="2" estado="inativo">
		<nome>Jefferson</nome>
		<email>Jefferson@uol.com.br</email>
	</cliente>
	<cliente id="3" estado="pendente">
		<nome>Jessica</nome>
		<email>Jessica@uol.com.br</email>
	</cliente>
</clientes>
arquivo Cliente.xml

Vamos agora criar o arquivo Cliente.xsd . No menu Project selecione Add new Item e clique,e , na janela selecione o tipo Text File e salve o arquivo com o nome Cliente.xsd.

Agora inclua a seguinte definição esquema XSD para o arquivo para descrever a gramática do documento XML:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="clientes">
		<xs:complexType>
			<xs:sequence>
				<xs:element maxOccurs="unbounded" name="cliente">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="nome" type="xs:string" />
							<xs:element name="email" type="xs:string" />
						</xs:sequence>
						<xs:attribute name="id" type="xs:int" use="required" />
						<xs:attribute name="estado" type="xs:string" use="required" />
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

 

Já temos os arquivos Cliente.xml e Cliente.xsd , que devem estar na mesma pasta, prontos para testarmos a rotina de validação:

Abra o Visual Basic 2005 e crie um novo projeto do tipo Windows Application como nome de validaXML,  e, no formulário padrão form1.vb inclua os controles :  Label, TextBox, Button, ListBox, MenuStrip e OpenFileDialog conforme o leiaute abaixo:

Defina os seguintes namespaces usados no projeto:

Imports System.Xml
Imports
System.Xml.Schema

Declare a seguinte variável no projeto:

Private resultado As Boolean = True

A seguir inclua o código abaixo no evento Click dos botões Abrir:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'abre a janela de dialogo e atribui o arquivo selecionado a caixa de texto txtXML

If ofd.ShowDialog = DialogResult.OK Then

    txtXML.Text = ofd.FileName

End If

End Sub
 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

'abre a janela de dialogo e atribui o arquivo selecionado a caixa de texto txtXSD

If ofd.ShowDialog = DialogResult.OK Then

   txtXSD.Text = ofd.FileName

End If

End Sub

 

No evento Click do botão Validar XML digite o seguinte código:

Private Sub btnValidaXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValidaXML.Click


If
Not txtXML.Text = String.Empty And Not txtXSD.Text = String.Empty
Then

   resultado = True

    Dim settings As New XmlReaderSettings()

   AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationEventHandler


    'Valida o arquivo XML com o seu Schema XSD

    lstValida.Items.Add("Validando o arquivo XML " & txtXML.Text & " com o arquivo de Schema : " & txtXSD.Text)

    Try

       settings.ValidationType = ValidationType.Schema

       settings.Schemas.Add("schema.xsd", XmlReader.Create(txtXSD.Text))
 

       Using XmlValidatingReader As XmlReader = XmlReader.Create(txtXML.Text, settings)

           While XmlValidatingReader.Read()

            End While

             End Using

      Catch ex As Exception

        lstValida.Items.Add(ex.Message)

        Exit Sub

    End Try

   lstValida.Items.Add("Validação concluída -> " & IIf(resultado = True, "Arquivo validado com SUCESSO", "Validação FALHOU"))

Else

    MsgBox("Informe o arquivo XML e o arquivo XSD.")

End If
End Sub

Abaixo temos o código do evento ValidationEventHandler

Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)


resultado =
False

lstValida.Items.Add(vbTab + "Erro de Validação : " + args.Message)


If
args.Severity = XmlSeverityType.Warning
Then

    MsgBox("Nenhum arquivo de Schema foi encontrado para efetuar a validação...")

ElseIf args.Severity = XmlSeverityType.Error Then

    MsgBox("Ocorreu um erro durante a validação....")

End If

If Not (args.Exception Is Nothing) Then ' Erro na validação do schema XSD

     MsgBox(args.Exception.SourceUri + "," & args.Exception.LinePosition & "," & args.Exception.LineNumber)

End If

End Sub

Executando o projeto para os arquivos XML e XSD criados teremos:

Pegue o projeto completo aqui :   validaXML.zip

Eu sei é apenas VB .NET , mas eu gosto...

Referências:  http://support.microsoft.com/kb/318504


José Carlos Macoratti