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)
|
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 ? |
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:
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.XmlDeclare a seguinte variável no projeto:
Private resultado As Boolean = TrueA 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 ThentxtXML.Text = ofd.FileName End If End SubPrivate 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 ThentxtXSD.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
resultado = True Dim settings As New XmlReaderSettings() AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationEventHandler
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 |
Abaixo temos o código do evento ValidationEventHandler
Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
lstValida.Items.Add(vbTab + "Erro de Validação : " + args.Message)
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 XSDMsgBox(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