 VB.
NET 2005 - Validando um documento XML com XSD
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:
| PrivateSub 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 txtXMLIf ofd.ShowDialog = DialogResult.OK Then txtXML.Text = ofd.FileName End IfEnd 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 txtXSDIf ofd.ShowDialog = DialogResult.OK Then txtXSD.Text = ofd.FileName End IfEnd Sub 
 | 
No evento Click do botão Validar XML digite o seguinte código:
| PrivateSub 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
| PublicSub 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 IfIf Not (args.Exception Is Nothing) Then ' Erro na validação do schema XSD MsgBox(args.Exception.SourceUri + "," & args.Exception.LinePosition & "," & args.Exception.LineNumber) End IfEnd Sub | 
Executando o projeto para os arquivos XML e XSD criados teremos:

Pegue o projeto completo aqui :
 validaXML.zip
 
validaXML.zip
Eu sei é apenas VB .NET , mas eu gosto...

Referências: http://support.microsoft.com/kb/318504
José Carlos Macoratti