ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Validar XML com método validateNode do XMLDOMDocument3 ???

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
verick10
Novato
Novato


Registrado: Segunda-Feira, 13 de Fevereiro de 2012
Mensagens: 7
Localização: São Roque - SP

MensagemEnviada: Seg Fev 13, 2012 5:00 pm    Assunto: Validar XML com método validateNode do XMLDOMDocument3 ??? Responder com Citação

Boa tarde Pessoal,

gostaria da ajuda de vocês, estou tentando validar um XML utilizando o método ValidateNode(IXMLDOMNode) disponível para IXMLDOMDocument3! Alguém ai tem esperiência neste item?

A rotina que eu fiz, criei uma função recursiva para pegar todos os nodes do meu XML, armazeno em uma lista com o tipo específico (IXMLDOMNode) e depois faço uma repetição para passar cada item da minha lista para a função ValidateNode.

Porém a mensagem que tenho para todos os nodes, é que eles foram utilizados mas não foram declarados no DTD/schema. O schema está sendo carregado corretamente na propriedade Schemas de XMLDomDocument, tando é que consigo validar diretamente pelo método validate.

Por favor, avaliem o código criado, qualquer ajuda será bem vinda.

Segue o código aproximado:

var
DOMDocument: IXMLDOMDocument3;
ParseError: IXMLDOMParseError;
schema: XMLSchemaCache;
Tipo, I, j: Integer;
Lista : TList<IXMLDOMNode>;
begin
DOMDocument.async := False;
DOMDocument.resolveExternals := False;
DOMDocument.validateOnParse := True;
DOMDocument.loadXML(MeuArquivoXML);
Lista := TList<IXMLDOMNode>.Create;
schema := CoXMLSchemaCache50.Create;
schema.add('http://www.portalfiscal.inf.br/cte',ExtractFileDir(Application.ExeName)) + 'Schemas\cte_v1.03.xsd');
DOMDocument.schemas := schema;

//função recursiva, que retorna para lista de (IXMLDOMNode) todos nos nodes do meu XML
GetChildsMSXML(DOMDocument.documentElement.childNodes.nextNode,Lista);

//se eu passar cada node, não consigo validar!!
for j := 0 to Lista.Count - 1 do
begin
//apenas para teste, teriam vários outros controles com base no retorno
Msg := Msg + DOMDocument.validateNode(Lista.Items[j]).reason;
end;

//porém se eu validar o documento todo, funciona
ParseError := DOMDocument.validate;
Result := (ParseError.errorCode = 0);
Msg := ParseError.reason;



ai a pergunta que todos farão é a seguinte, se o documento todo eu consigo validar, porque quero validar cada node?

Bem, eu preciso validar individualmente porque será mais fácil controlar o node que deu o erro, no exato momento que isso ocorreu, podendo pegar seu 'ParentNode' para chegar ao node pai, podendo mostrar a hierarquia, entre outros controles.
Será feito o uso de expressões regulares para interpretar os erros gerados pela validação e exibir uma mensagem mais amigável para o usuário, informado o node.

Já olhei documentação de XMLDOM, vi vários exemplos em C++, VB, etc. Todos trabalham basicamente desta mesma forma que eu fiz.

Ficarei grato se alguém me der alguma luz.


Abraço
Eric Helfenstens
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
verick10
Novato
Novato


Registrado: Segunda-Feira, 13 de Fevereiro de 2012
Mensagens: 7
Localização: São Roque - SP

MensagemEnviada: Qui Fev 23, 2012 8:49 am    Assunto: Responder com Citação

olá

ninguém teve contato com isso? alguma idéias sugestão? Laughing

abraço
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB