Validar XML schema XSD

25/07/2014

33

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
Responder

Post mais votado

30/07/2014

Wilson, deu certo cara, muito obrigado.
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
dá erro nesse comando:

XML.validateOnParse := True;
Responder
consegui pelo componente TXMLDocument, mas acontece que quando encontro o primeiro erro ele sai, gostaria de percorrer o resto do arquivo
Responder
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
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
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