Validar XML schema XSD

25/07/2014

0

Olá Amiogos, gostaria de saber como que faço pra validar um arquivo XML atraves de um schema XSD. Agradeço desde já pela ajuda de todos
Anderson Ferreira

Anderson Ferreira

Responder

Post mais votado

30/07/2014

Wilson, deu certo cara, muito obrigado.

Anderson Ferreira

Anderson Ferreira
Responder

Mais Posts

25/07/2014

Wilson Brito

uses ComObj;

function ValidarXmlComXsd(FileXml, FileXsd: string): String;
var
    XML, XSDL: Variant;
begin
try
  XSDL := CreateOLEObject('MSXML2.XMLSchemaCache.4.0');
  XSDL.validateOnLoad := True;
  XSDL.add('',FileXsd);
  XML := CreateOLEObject('MSXML2.DOMDocument.4.0');
  XML.validateOnParse := True;
  XML.resolveExternals := True;
  XML.schemas := XSDL;
  XML.load(FileXml);
  Result := XML.parseError.reason;
finally
  XSDL := varNull;
  XML := varNull;
end;
end;
Responder

25/07/2014

Anderson Ferreira

dá erro nesse comando:

XML.validateOnParse := True;
Responder

25/07/2014

Anderson Ferreira

consegui pelo componente TXMLDocument, mas acontece que quando encontro o primeiro erro ele sai, gostaria de percorrer o resto do arquivo
Responder

28/07/2014

Anderson Ferreira

Olá Wilson Brito, consegui rodar sua função, mas acontece que consigo pegar apenas um erro cada vez que executo a função, como faço para encontrar todos os erros que o arquivo XML pode ter e trazer a listagem dos erros?

Agradeço pela ajuda.
Responder

28/07/2014

Anderson Ferreira

Olá Wilson Brito, consegui rodar sua função, mas acontece que consigo pegar apenas um erro cada vez que executo a função, como faço para encontrar todos os erros que o arquivo XML pode ter e trazer a listagem dos erros?

Agradeço pela ajuda.
Responder

30/07/2014

Wilson Brito

Anderson,

Segue o código atualizado utilizando a versão 6 do MSXML. Você também pode utilizar a versão 5.
Aguardo retorno.

function ValidarXmlComXsd(FileXml, FileXsd: string): TStringList;
var
    XML, XSDL: Variant;
procedure LerXml(XmlNode: Variant; var Xml: Variant; var Result: TStringList);
var
  i: integer;
  AttrNode: Variant;
  Erro: String;
begin
  for i := 0 to XmlNode.childNodes.length -1 do begin
    AttrNode := XmlNode.childNodes.item[i];
    if Trim(AnsiLowerCase(AttrNode.nodeTypeString)) = 'element' then begin
      Erro := Trim(Xml.validateNode(AttrNode).reason);
      If (Erro <> '') then begin
        if Result.Count = 0 then
          Result.Add(Erro)
        else if Result[Result.Count-1] <> Erro then
          Result.Add(Erro);
      end;
      LerXml(AttrNode, Xml, Result);
    end;
  end;
end;
begin
try
  Result := TStringList.Create;
  Result.Clear;
  XSDL := CreateOLEObject('MSXML2.XMLSchemaCache.6.0');
  XSDL.validateOnLoad := True;
  XSDL.add('',FileXsd);
  XML := CreateOLEObject('MSXML2.DOMDocument.6.0');
  XML.validateOnParse := False;
  XML.resolveExternals := True;
  XML.schemas := XSDL;
  XML.load(FileXml);
  LerXml(xml, xml, Result);
finally
  XSDL := varNull;
  XML := varNull;
end;
end;


Como utilizar:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines := ValidarXmlComXsd('c:\teste.xml', 'c:\teste.xsd');
end;
Responder

11/01/2017

Diego Freitas

Olá Pessoal!
Pra mim está retornando o erro:
file:///c:/NFe/nfe_v3.10.xsd#/schema
The " namespace provided differs from the schema´s 'http://www.portalfiscal.inf.br/nfe' targetNamespace

Alguém poderia me ajudar?
Responder

20/09/2017

Everaldo Informação

Olá Neste trecho voce deve passar o namespace da NFe, ao invés de vazio conforme está no exemplo.

XSDL.add('http://www.portalfiscal.inf.br/nfe',FileXsd);
Responder

15/11/2021

Luciano Cremonese

Olá!
Baixei o código acima e mesmo assim tive problemas na validação .
No meu caso o XSD disponibilizado pelo terceiro é dividido em 3 arquivos.
Com os os dados principais e que tem a importação dos outros dois com dados simples e complexos.
Eu sei que está importando os 2 arquivos pois ao gerar o erro me informa o padrão, porém o padrão é válido pelo dado, porém ele continua acusando erro.
Vejam abaixo
'86010480' viola a restrição pattern de '^[0-9]$'.
Falha da análise do elemento '{http://XXXXXXXXXX.com.br/V1_00_00/schemas}cep' com valor '86010480'.
'87470000' viola a restrição pattern de '^[0-9]$'.
Falha da análise do elemento '{http://XXXXXXXXXX.com.br/V1_00_00/schemas}cep' com valor '87470000'.
'04/10/1971' viola a restrição pattern de '^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d)$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d)$'.
Falha da análise do elemento '{http://XXXXXXXXXX.com.br/V1_00_00/schemas}dataNascimento' com valor '04/10/1971'.
'99990000' viola a restrição pattern de '^[0-9]{6,18}$'.
Falha da análise do elemento '{http://drswbj01.allianz.com.br/V1_00_00/schemas}telefone' com valor '99990000'.
'lalalala@emailvalido.com.br' viola a restrição pattern de '^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4})$'.
Falha da análise do elemento '{http://XXXXXXXXXX.com.br/V1_00_00/schemas}email' com valor 'sinistro@agriseguro.com.br'.




Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar