Fórum Validar XML schema XSD #486786
25/07/2014
0
Anderson Ferreira
Curtir tópico
+ 2Post mais votado
30/07/2014
Anderson Ferreira
Gostei + 2
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;
Gostei + 0
25/07/2014
Anderson Ferreira
XML.validateOnParse := True;
Gostei + 0
25/07/2014
Anderson Ferreira
Gostei + 0
28/07/2014
Anderson Ferreira
Agradeço pela ajuda.
Gostei + 0
28/07/2014
Anderson Ferreira
Agradeço pela ajuda.
Gostei + 0
30/07/2014
Wilson Brito
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
11/01/2017
Diego Freitas
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
20/09/2017
Everaldo Informação
XSDL.add('http://www.portalfiscal.inf.br/nfe',FileXsd);
Gostei + 0
15/11/2021
Luciano Cremonese
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
Clique aqui para fazer login e interagir na Comunidade :)