Você está na página 1de 5

Compartilhar Denunciar abuso Próximo blog» Criar um blog Login

terça-feira, 14 de abril de 2009

Validando um XML contra seu esquema XSD Quem sou eu

Luís Gustavo Fabbro


No dia a dia do profissional de TI, cada vez mais é necessário
trabalhar com dados no formato XML. Vira e mexe, é preciso
ainda saber se um XML está bem formado, isto é, se ele atende
os requisitos dispostos num arquivo de esquema. Um exemplo
bem recente disso são os XML a serem enviados para a Receita
Bacharel em Ciências da Computação,
Federal no âmbito da Escrituração Digital (Sped) e Nota Fiscal formado pela Unesp Bauru. Foi
Eletrônica, onde esses XML têm que seguir regras de formação responsável pelos módulos da área
bem definidas pela Receita, através de arquivos XSD (esquemas). industrial do ERP da ABC71 Soluções
em Informática entre 1993 e 1998. Em
Os esquemas para NFe podem ser encontrados aqui.
2002, passou a ser responsável pela
nascente área de Pesquisa &
Pesquisando no Google, encontrei uma porção de sites capazes Desenvolvimento da empresa. É
profissional certificado pela Microsoft,
de fazer a validação on-line e também ferramentas - algumas
com especialização em arquitetura do
gratuitas, outras pagas. No caso da NFe, a própria Receita Sistema Operacional Windows.
Federal faz essa validação mas é preciso submeter ao Web
Service deles e aguardar a resposta assíncrona. Contato:
balaiotecnologico@gmail.com
Como não encontrei nada que eu achasse prático, resolvi montar
um validador por minha conta, para ter à mão sempre que
necessário. Pra minha surpresa, descobri que o framework .Net já
Seguidores
possui classes para validar um XML e que o uso delas é bastante
simples.
 
Seguir
Google Friend Connect
Mãos à obra ! Montei uma aplicação simples C# no Visual Studio
Seguidores (89) Mais »
2008 : tem 3 caixas de edição e um botão.

Já é um membro?Fazer login

Mais ...

Ao clicar o botão, o arquivo indicado na caixa Caminho do XML é Assinar feed RSS
carregado através de um Reader previamente configurado para
realizar a validação junto com a carga. Abaixo, o código
comentado do evento de clique no botão :
Compartilhe
// XmlReaderSettings é a configuração de como o XML deve ser
lido                      
XmlReaderSettings settings = new XmlReaderSettings();

// Informa qual é o namespace (se houver) e o caminho do


Marcadores
esquema
 
// XSD que será usado p/ validar o XML durante a leitura .NET (12)
settings.Schemas.Add (edNamespace.Text, edXSD.Text); ADO (3)
Artigos (5)
// Se dentro do XSD houver referência a outros XSDs externos, pode ser C# (8)
// necessário ter certas permissões para localizá-lo.Usa um "Resolver" C++ Builder (32)
// com as credencias-padrão para obter esse recurso externo. CAPICOM (4)

XmlUrlResolver resolver = new XmlUrlResolver(); Componentes (5)


Conceitos (26)
resolver.Credentials = CredentialCache.DefaultCredentials;
Delphi (89)
// Informa à configuração de leitura do XML que deve usar o Design Patterns (29)
Excel (10)
// "Resolver" criado acima e que a validação deve respeitar
Ferramentas (20)
// o esquema informado no início. HTML (13)
settings.XmlResolver = resolver; Notícias (36)
settings.ValidationType = ValidationType.Schema; Registry (4)
Script (17)
try { SQL (7)
Threads (7)
// Abre o arquivo XML cujo caminho foi informado na tela.
Windows (26)
FileStream fs = new FileStream(edXML.Text, FileMode.Open,
XML (11)
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 Arquivo do blog


trabalhar.
►  2011 (1)
XmlReader reader = XmlReader.Create (fs, settings);
►  2010 (66)
// Constrói um documento XML vazio ▼  2009 (121)
XmlDocument xmlDoc = new XmlDocument(); ►  Dezembro (7)
►  Novembro (8)
// Manda carregar as informações através do leitor.
►  Outubro (14)
xmlDoc.Load(reader);
►  Setembro (14)
// Só chega aqui se carregou tudo OK. ►  Agosto (14)
MessageBox.Show(this, "Validação concluída com sucesso.", "Aviso", ►  Julho (15)
MessageBoxButtons.OK, MessageBoxIcon.Information); ►  Junho (15)
►  Maio (20)
} catch (Exception exc)
▼  Abril (14)
{
Criando aplicações HTML
// Se houver erro na validação do XML, uma exceção é levantada e o fluxo Lançamento do Windows 7
// vem para esse ponto, exibindo a mensagem de erro. Ligando .NET e C++ Win32 numa
MessageBox.Show(this, exc.Message, "Erro", MessageBoxButtons.OK, mesma solução
MessageBoxIcon.Error); Controlando Serviços do Windows
com Batch Files
}
Conferência sobre Engenharia de
Software
Ao final, se foi tudo OK com a carga, tem-se na instância xmlDoc Trabalhando com o Certificate Store
a árvore do XML montada, validada e pronta para ser usada pelo em Win32
programa. Limpeza do Registro do Windows
Trabalhando com o Certificate Store
do Windows
Obs: No lugar de ler o XML de um arquivo, pode-se usar qualquer
Aplicações Delphi e C++ Builder 64
tipo de Stream - até mesmo lido da memória (MemoryStream). bits
Nova versão do HTML
Clique aqui para fazer o download do programa. Validando um XML contra seu
esquema XSD
Comando INSERT do SQL em tabela
Mais Informações com BLOB
XML na W3C, Esquemas XML para Nota Fiscal Eletrônica, Criando um applet para o Painel de
Download do programa de exemplo Controle do Win...
Alô, mundo !
Postado por Luís Gustavo Fabbro às 18:45

Marcadores: .NET, C#, XML


Reações: 
11 comentários:

Chris Redfield disse...

Poste o link para dowload desse programa


16 de junho de 2009 12:20

Gustavo Fabbro disse...

Chris

Obrigado pelo seu feedback ! Inclui no post um link para


download do programa do exemplo.

[]s
16 de junho de 2009 14:33

Anônimo disse...

Uma duvida esse validador identica a má formação do XML, eu


pergunto porque tive uma resposta da receita dessa forma
"má formação do XML" em ambiente Scan.

Meu email: analista.edilson@hotmail.com


30 de setembro de 2009 09:38

Gustavo Fabbro disse...

A ideia do programa é justamente verificar se o XML está bem


formado, isto é, se ele atende às regras de formação
estipuladas no XSD (esquema). Então, a resposta é "sim", ele
será capaz de apontar as má formações estruturais
apresentadas pelo seu XML.

No entanto, ele não conseguirá identificar má formação


semântica, isto é, relativa aos cruzamentos que a Receita
Federal faz com alguns campos. Por exemplo, se a inscrição
estadual informada é válida ou não; se o Estado ou Município
do Emissor que foi informado na NFe está diferente daquele
registrado na própria Receita; etc..
30 de setembro de 2009 11:17

Anônimo disse...

Gustavo,

Vejo que no exemplo disponível para download tem como


pegar todos os erros e apenas o primeiro. Como você fez isso?
1 de setembro de 2010 12:04

Luís Gustavo Fabbro disse...

No código listado no post, o .NET gera uma exceção quando o


primeiro erro é encontrado, interrompendo imediatamente a
validação.

Para obter todos os erros de uma vez, usei o evento


ValidationEventHandler existente no XmlReaderSettings.
Para usá-lo, crie uma nova instância da classe
ValidationEventHandler e a atribuí à propriedade de mesmo
nome no settings. O construtor dessa classe recebe como
parâmetro uma função para onde as exceções relativas à
validação são redirecionadas.

Assim, basta concatenar as mensagens de erro recebidas por


essa função e exibí-las ao fim da validação.
8 de setembro de 2010 11:18

Kaichiro Fukuda disse...

Opa, boa tarde a todos.

Não compreendi muito bem a parte:


"Para obter todos os erros de uma vez, usei o evento
ValidationEventHandler existente no XmlReaderSettings. Para
usá-lo, crie uma nova instância da classe
ValidationEventHandler e a atribuí à propriedade de mesmo
nome no settings. O construtor dessa classe recebe como
parâmetro uma função para onde as exceções relativas à
validação são redirecionadas" !?!
25 de outubro de 2010 18:02

Luís Gustavo Fabbro disse...

Kaichiro

A versão do código C# para validação que está reproduzida no


post interrompe sua execução ao encontrar um erro; outros
erros que eventualmente existam no XML só serão revelados
depois que esse primeiro erro for corrigido.

Assim, se quiser capturar todos os erros do XML de uma única


vez, responda ao evento ValidationEventHandler existente no
XmlReaderSettings. A cada erro encontrado, o evento é
disparado uma vez, dando a oportunidade de você salvar as
mensagens para exibição.

Veja a documentação dele no MSDN : evento


ValidationEventHandler
26 de outubro de 2010 13:37

Kaichiro Fukuda disse...

Opa, vlw. Deu certo agora.


27 de outubro de 2010 15:02

Anônimo disse...

Olá Luis, posso usar seu programa como um fiel da balança


para um cliente, explico.
Tenho que gerar vários xml para esse cliente, meu programa
gera e valida, mas eu gostaria de um programa de terceiros
para ficar como um "tira-teima", posso usar seu programa
para isso?? tem algum custo??
18 de novembro de 2010 12:28

Luís Gustavo Fabbro disse...

Pode usá-lo, sem problemas. Ele não tem custo, até porque o
código que faz a validação está todo reproduzido no post. Isto
também te deixa livre para criar sua própria versão do
validador, implementando outras funcionalidades que julgar
necessárias.
18 de novembro de 2010 13:07

Postar um comentário
Comentar como: Selecionar perfil...

Postar comentário Visualizar

Links para esta postagem

Criar um link

Postagem mais recente Início Postagem mais antiga

Assinar: Postar comentários (Atom)


TISS XML Cursos online VB e C#
Faturamento de guias no padrao TISS Tutor+Certificado+Início Imediato Cursos
Experimente gratis. Faça cadastro. Básicos e Avanç. desde 1993
www.tissxml.com.br www.learning.com.br

Você também pode gostar