Validar XML schema XSD
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
Curtidas 2
Melhor post
Anderson Ferreira
30/07/2014
Wilson, deu certo cara, muito obrigado.
GOSTEI 2
Mais Respostas
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
25/07/2014
dá erro nesse comando:
XML.validateOnParse := True;
XML.validateOnParse := True;
GOSTEI 0
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
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.
Agradeço pela ajuda.
GOSTEI 0
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.
Agradeço pela ajuda.
GOSTEI 0
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.
Como utilizar:
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
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?
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
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);
XSDL.add('http://www.portalfiscal.inf.br/nfe',FileXsd);
GOSTEI 0
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
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