verick10 Novato

Registrado: Segunda-Feira, 13 de Fevereiro de 2012 Mensagens: 7 Localização: São Roque - SP
|
Enviada: Seg Fev 13, 2012 5:00 pm Assunto: Validar XML com método validateNode do XMLDOMDocument3 ??? |
|
|
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 |
|