Validar XML schema XSD

Delphi

25/07/2014

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

Curtidas 2

Melhor post

Anderson Ferreira

Anderson Ferreira

30/07/2014

Wilson, deu certo cara, muito obrigado.
GOSTEI 2

Mais Respostas

Wilson Brito

Wilson Brito

25/07/2014

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;
GOSTEI 0
Anderson Ferreira

Anderson Ferreira

25/07/2014

dá erro nesse comando:

XML.validateOnParse := True;
GOSTEI 0
Anderson Ferreira

Anderson Ferreira

25/07/2014

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

Anderson Ferreira

25/07/2014

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.
GOSTEI 0
Anderson Ferreira

Anderson Ferreira

25/07/2014

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.
GOSTEI 0
Wilson Brito

Wilson Brito

25/07/2014

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;
GOSTEI 0
Diego Freitas

Diego Freitas

25/07/2014

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?
GOSTEI 1
Everaldo Informação

Everaldo Informação

25/07/2014

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);
GOSTEI 0
Luciano Cremonese

Luciano Cremonese

25/07/2014

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'.




GOSTEI 0
POSTAR