Validando um documento XML usando o XML Schema Definition (XSD)

Nesse artigo vamos aprender como validar um documento XML usando o XML Schema Definition, ou apenas XSD.
Como exemplo utilizaremos a Nota Fiscal Eletrônica de Serviços, mas antes de começar vamos a uma breve explicação sobre o funcionamento do XSD.

XML Schema define as regras de validação em documentos XML, abaixo temos o XSD fornecido pela GINFES para validação da NFS-e.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tipos="http://www.ginfes.com.br/tipos_v03.xsd"  targetNamespace="http://www.ginfes.com.br/servico_enviar_lote_rps_envio_v03.xsd"
            xmlns="http://www.ginfes.com.br/servico_enviar_lote_rps_envio_v03.xsd" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" attributeFormDefault="unqualified" elementFormDefault="qualified">
	<xsd:import schemaLocation="tipos_v03.xsd"	namespace="http://www.ginfes.com.br/tipos_v03.xsd" />
	<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema20020212_v03.xsd"/>
	<xsd:element name="EnviarLoteRpsEnvio">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="LoteRps" type="tipos:tcLoteRps"/>
				<xsd:element ref="dsig:Signature" minOccurs="0" maxOccurs="1"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>

Se você não está familiarizado com o código acima não tem problema, não é necessário saber construir um XSD para usá-lo.

O padrão XSD ou XS (Xml Schema) é baseada no formato XML, é a recomendação oficial do W3C desde 2001 para validação de documentos XML.

Agora vamos ao código! Para entendê-lo melhor leia os comentários.

Public Function ValidarXML(ByVal strArquivoXML As String)

        Try
            'Criamos um arquivo XML temporário
            Dim strArquivoTmp = System.IO.Path.GetTempPath() & CInt(Rnd() * 10000) & ".xml"
            Dim CriarArquivo As New StreamWriter(strArquivoTmp)
            CriarArquivo.Write(strArquivoXML)
            CriarArquivo.Close()

	    'Iniciamos o objeto que vai guardar as configurações do leitor XML
            Dim Configuracoes As New XmlReaderSettings()

	    'Adicionamos o arquivo XSD, informamos o namespace e o caminho do XSD.
            Configuracoes.Schemas.Add("http://www.ginfes.com.br/servico_enviar_lote_rps_envio_v03.xsd", "C:\XSD\servico_enviar_lote_rps_envio_v03.xsd")

            'Se dentro do XSD houver referência a outros XSDs externos, pode ser necessário ter certas permissões para localizá-lo.
            'Para obter esse recurso externo utilizamos as credenciais padrão.
            Dim XsdExternos As New XmlUrlResolver
            XsdExternos.Credentials = CredentialCache.DefaultCredentials

            'Informa quais configurações de leitura devem usadas, a variável XsdExternos é usada para resolver os recursos externos
            'e que a validação deve respeitar o esquema informado no início.
             Configuracoes.XmlResolver = XsdExternos
             Configuracoes.ValidationType = ValidationType.Schema

            'Abre o arquivo XML temporário
            Dim fsXml As New System.IO.FileStream(strArquivoTmp, FileMode.Open, FileAccess.Read)

            'Constrói o leitor de XML, passando o arquivo XML que foi aberto e as configurações que sinalizam como o leitor deve trabalhar.
            Dim rdrXMl As XmlReader = XmlReader.Create(fsXml, Configuracoes)
            'Manda carregar as informações nesse XML, se falhar é porque o XML não é válido.
            XDocument.Load(rdrXMl)

            fsXml.Close()
            System.IO.File.Delete(strArquivoTmp)

            Return True

        Catch ex As Exception
            Return False
        End Try

    End Function

Agora é só chamar o procedimento e passar o caminho da NFS-e.

Dim strCaminhoDoArquivo As String = "C:\Documento.xml"
If ValidarXML(strCaminhoDoArquivo) = True Then
   MessageBox.Show("Arquivo XML válido!")
Else
  MessageBox.Show("Arquivo XML inválido!")
End If

Nesse exemplo utilizei a Nota Fiscal Eletrônica de Serviços, se precisar validar outro tipo XML é só trocar o namespace e o caminho do XSD.

Por enquanto é só. Até a próxima.

Anúncios

2 Responses to Validando um documento XML usando o XML Schema Definition (XSD)

  1. Parabéns pelo artigo Diogo!

    Bem simples e objetivo.

    Waldir

  2. Marcos Almeida says:

    Diogo estou iniciando um desenvolvimento para NFSe de São josé dos campos – SP. E não encontro em nenhum lugar um XML VALIDADO para me servir como exemplo.

    Voce poderia me enviar um XML ( NFSe ) Validado ?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: