wanderso Posted May 9, 2017 Report Share Posted May 9, 2017 Olá pessoal, Tenho o seguinte xml que é retornado pelo sefaz quando faço uma consulta de uma chave de um Mdf-e. Necessito ler e pegar alguns valores para gravar no banco de dados. Utilizo a xml do harbour para pesquisar mas no caso do xml em questão existem 3 tags com o mesmo nome que é o nProt, como quero pegar o último deles a função xmlNode := xmlIter:Find('nProt') não funciona já que me retorna o valor do primeiro achado. Sei que poderia percorrer linha a linha mas não existe algo mais rápido e eficaz? Obrigado. <?xml version="1.0"?> -<retConsSitMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> <tpAmb>1</tpAmb> <verAplic>RS20170502153044</verAplic> <cStat>101</cStat> <xMotivo>Cancelamento de MDF-e homologado</xMotivo> <cUF>52</cUF> -<protMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> -<infProt Id="MDFe952170000152757"> <tpAmb>1</tpAmb> <verAplic>RS20161212154033</verAplic> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <dhRecbto>2017-01-16T10:33:57</dhRecbto> <nProt>952170000152757</nProt> <digVal>Er88UgvkA2D7MhD6ySwlrCGOOqE=</digVal> <cStat>100</cStat> <xMotivo>Autorizado o uso do MDF-e</xMotivo> </infProt> </protMDFe> -<procEventoMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> -<eventoMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> -<infEvento Id="ID1101115217010876666000019058002000000095193116238301"> <cOrgao>52</cOrgao> <tpAmb>1</tpAmb> <CNPJ>08766660000190</CNPJ> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <dhEvento>2017-01-16T10:51:59</dhEvento> <tpEvento>110111</tpEvento> <nSeqEvento>1</nSeqEvento> -<detEvento versaoEvento="1.00"> -<evCancMDFe> <descEvento>Cancelamento</descEvento> <nProt>952170000152757</nProt> <xJust>ERRO DE DIGITACAO</xJust> </evCancMDFe> </detEvento> </infEvento> -<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> -<SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> -<Reference URI="#ID1101115217010876666000019058002000000095193116238301"> -<Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>kRHoHMLxxZrA0EyBM3EnlDHS8bQ=</DigestValue> </Reference> </SignedInfo> <SignatureValue>cwfUdY8cH5r2ShMlpoP7NWqDS/OBWq7JCzmReNXY3lrHVNNLB4AYmMzI8WnrW6Z560GzOiy4cPJ7Q/egoyAxVBagRbqA7aSr2BzAH2e76wKWqm52+hkqBnb+1Q/J0aL7h2i/X9CAQF6l6+fOA3TotCYpiyfqVdFV88eB3nDveydViNYdwsXk1lVfuwFcXIpegAi9lgN3SGz0/K1/5+FXOFijvHfARt9KYimXXAPWpN5wk8S6ECG4gkwIXAwIhdFI5AciHol2sAX6uL8oUBxouTZnw+ipFpnSoK26dbcIy3iYL8qOMrlJaCNNly1vxO/Du2PJmDj9+Bvm8ybQdBiRrg==</SignatureValue> -<KeyInfo> -<X509Data> <X509Certificate>MIIIYTCCBkmgAwIBAgIQfYPG/2S8JT5uW+riAKpTajANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDEtMCsGA1UECxMkQ2VydGlzaWduIENlcnRpZmljYWRvcmEgRGlnaXRhbCBTLkEuMSEwHwYDVQQDExhBQyBDZXJ0aXNpZ24gTXVsdGlwbGEgRzUwHhcNMTYwNTA5MDAwMDAwWhcNMTcwNTA4MjM1OTU5WjCB2TELMAkGA1UEBhMCQlIxEzARBgNVBAoUCklDUC1CcmFzaWwxITAfBgNVBAsUGEF1dGVudGljYWRvIHBvciBBUiBDZXJ0YTEbMBkGA1UECxQSQXNzaW5hdHVyYSBUaXBvIEExMRYwFAYDVQQLFA1JRCAtIDEwMzQ3NDA1MS4wLAYDVQQDEyVMSU5LIFRSQU5TUE9SVEVTIEUgTE9HSVNUSUNBIExUREEgRVBQMS0wKwYJKoZIhvcNAQkBFh5jb250YXRvQGxpbmt0cmFuc3BvcnRlcy5jb20uYnIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCipwobrqIN041DvkHb+6dt3jZMSgY3kMTyXo6PPsJ98PoQIMhxR5SmTORuDWPAAbaaz54YT+CrTp0BGo2qwR7mWbwhsmjr6L6rWcLJajgEjJV/QRBITASzXw5SxdAz3o7ipFgvxTSPeJptsTyw0IdoDWMWlZXb3lSec3/LGzBAjbnPooH8ncK7g+AS142t274mjOpmRqRvQ0lpCd6Dgmha2QThwgWtNkC6q7RtTEyi7oDSQUljgVwQ7mWlhqNWsCOcyoDd697wzSioyxW0emFt9IcXtSJ6K7s85/4vLSFwIVI9n9uW/eZzIzYx6z7rb+9GwKhOO3cJBOVRvbgFXWWLAgMBAAGjggOHMIIDgzCBzQYDVR0RBIHFMIHCoD0GBWBMAQMEoDQEMjA0MDkxOTY5NDM5NzcwNDkxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU2MTk0OFNTUEdPoC0GBWBMAQMCoCQEIlNFUkdJTyBKT1NFIFBJUkVTIE1BQ0hBRE8gQlJBR0FOQ0GgGQYFYEwBAwOgEAQOMDg3NjY2NjAwMDAxOTCgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgR5jb250YXRvQGxpbmt0cmFuc3BvcnRlcy5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSdUM+9/yTKr7Ez6xfiQnqOaSqOUzAOBgNVHQ8BAf8EBAMCBeAwgYkGA1UdIASBgTB/MH0GBmBMAQIBCzBzMHEGCCsGAQUFBwIBFmVodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2RwYy9BQ19DZXJ0aXNpZ25fTXVsdGlwbGEvRFBDX0FDX0NlcnRpU2lnbk11bHRpcGxhLnBkZjCCASUGA1UdHwSCARwwggEYMFygWqBYhlZodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2xjci9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDBboFmgV4ZVaHR0cDovL2ljcC1icmFzaWwub3V0cmFsY3IuY29tLmJyL3JlcG9zaXRvcmlvL2xjci9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDBboFmgV4ZVaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5nb3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwgaAGCCsGAQUFBwEBBIGTMIGQMGQGCCsGAQUFBzAChlhodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2NlcnRpZmljYWRvcy9BQ19DZXJ0aXNpZ25fTXVsdGlwbGFfRzUucDdjMCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5jZXJ0aXNpZ24uY29tLmJyMA0GCSqGSIb3DQEBCwUAA4ICAQDGDZJBI1kVZO5rTUgNTowFT2OjxcuQ9r+K+AikW4dM8BC4JFF058XXTqpVH20lrS89We1l+QWepX+P00i9pKbVuttz36bcVeRkIgSduxNXNjIhorKDzhObfRXMQiy6z7lyItCQxrYrcJAhjDjuNPuZR3tu+Rjn0HiGJ7745fjwLj9BZRNKPNGYiSV4Pdj8oOWKdhzkDMV6luM9s4S4/tFL+y13f/l9zYXDs3S52O7tF8UhFz5YS7mQzGv0LXfeuG0o+TlxaYkgzVAEHUssqvd0mM8e5qQtBuKCkUwuEuN6sqlRziEeOPw10NMSN1zReusR7YFiopyXJQf7ta6XeszRWGVUtf7ZbOxCpMzpq4lqJV/nbF17pUPQe6fAzCriMGnLDJ4ZGpzACuLIWX6CSxIbrqRxSrqiFfkt5DJJpCRbcMG8/bSgW/0d42ImqGitJLnecb0PwooFkcQhzC9O0gstbOyqejak6PoRuhs3tYIYMzneZ/gkT/hpl7wo3aD5XsiJtRvNZvtaErQ0GTBlpTlzWMh9CaAsesJuvRWPV3oB1BdasX3XhkqSKTBZVoQDjv4I44vDKM8hvq0Xo2TF31ux28KKDLQAk9nIHo6fIffyrbejPq8nYHsrX9pm1NYW9uSAtZGLMtL5itlYa8d5GTxmcrgv5ui1gSbdzLpfmX1Xxw==</X509Certificate> </X509Data> </KeyInfo> </Signature> </eventoMDFe> -<retEventoMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> -<infEvento Id="ID952170000153442"> <tpAmb>1</tpAmb> <verAplic>RS20161004163720</verAplic> <cOrgao>52</cOrgao> <cStat>135</cStat> <xMotivo>Evento registrado e vinculado ao MDF-e</xMotivo> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <tpEvento>110111</tpEvento> <xEvento>Cancelamento</xEvento> <nSeqEvento>1</nSeqEvento> <dhRegEvento>2017-01-16T10:54:00</dhRegEvento> <nProt>952170000153442</nProt> </infEvento> </retEventoMDFe> </procEventoMDFe> </retConsSitMDFe> Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted May 11, 2017 Report Share Posted May 11, 2017 Wanderso Boa noite Eu não uso os métodos e nem as funções XMLDOCUMENT, porém faço um tratamento de forma que pego os conteúdos de por etapas atrave´s de uma rotina particionada por GRUPOS E TAGS. Sugiro quer vc pense desta forma ou seja, pirmeiRo obtenha o XML completo e pegue o NODE que te interessa e dentro do NODE os grupos, e a partir da SUA última leitura despreze o trecho lido, assim vc não passa duas vezes pelo mesmo trecho. Exemplo: Pegue este trecho <protMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> -<infProt Id="MDFe952170000152757"> <tpAmb>1</tpAmb> <verAplic>RS20161212154033</verAplic> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <dhRecbto>2017-01-16T10:33:57</dhRecbto> <nProt>952170000152757</nProt> <digVal>Er88UgvkA2D7MhD6ySwlrCGOOqE=</digVal> <cStat>100</cStat> <xMotivo>Autorizado o uso do MDF-e</xMotivo> </infProt> </protMDFe> Após o uso, despreze toda partede anterior e pesquise a partir do restante que te interessa, ou seja, o próximo trecho: -<infEvento Id="ID1101115217010876666000019058002000000095193116238301"> <cOrgao>52</cOrgao> <tpAmb>1</tpAmb> <CNPJ>08766660000190</CNPJ> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <dhEvento>2017-01-16T10:51:59</dhEvento> <tpEvento>110111</tpEvento> <nSeqEvento>1</nSeqEvento> -<detEvento versaoEvento="1.00"> -<evCancMDFe> <descEvento>Cancelamento</descEvento> <nProt>952170000152757</nProt> <xJust>ERRO DE DIGITACAO</xJust> </evCancMDFe> </detEvento> </infEvento> e assim por diante. Espero ter ajudado. []s, Quote Link to comment Share on other sites More sharing options...
wanderso Posted May 11, 2017 Author Report Share Posted May 11, 2017 Wanderso Boa noite Eu não uso os métodos e nem as funções XMLDOCUMENT, porém faço um tratamento de forma que pego os conteúdos de por etapas atrave´s de uma rotina particionada por GRUPOS E TAGS. Sugiro quer vc pense desta forma ou seja, pirmeiRo obtenha o XML completo e pegue o NODE que te interessa e dentro do NODE os grupos, e a partir da SUA última leitura despreze o trecho lido, assim vc não passa duas vezes pelo mesmo trecho. Exemplo: Pegue este trecho <protMDFe versao="1.00" xmlns="http://www.portalfiscal.inf.br/mdfe"> -<infProt Id="MDFe952170000152757"> <tpAmb>1</tpAmb> <verAplic>RS20161212154033</verAplic> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <dhRecbto>2017-01-16T10:33:57</dhRecbto> <nProt>952170000152757</nProt> <digVal>Er88UgvkA2D7MhD6ySwlrCGOOqE=</digVal> <cStat>100</cStat> <xMotivo>Autorizado o uso do MDF-e</xMotivo> </infProt> </protMDFe> Após o uso, despreze toda partede anterior e pesquise a partir do restante que te interessa, ou seja, o próximo trecho: -<infEvento Id="ID1101115217010876666000019058002000000095193116238301"> <cOrgao>52</cOrgao> <tpAmb>1</tpAmb> <CNPJ>08766660000190</CNPJ> <chMDFe>52170108766660000190580020000000951931162383</chMDFe> <dhEvento>2017-01-16T10:51:59</dhEvento> <tpEvento>110111</tpEvento> <nSeqEvento>1</nSeqEvento> -<detEvento versaoEvento="1.00"> -<evCancMDFe> <descEvento>Cancelamento</descEvento> <nProt>952170000152757</nProt> <xJust>ERRO DE DIGITACAO</xJust> </evCancMDFe> </detEvento> </infEvento> e assim por diante. Espero ter ajudado. []s, Obrigado pela resposta, estava pensando em fazer isso, uma função para informar o node e a tag e fazer a leitura linha a linha mesmo. Valeu! Quote Link to comment Share on other sites More sharing options...
Edu Posted May 12, 2017 Report Share Posted May 12, 2017 Bom dia! Uma alternativa é fazer um While até achar a ultima tag. oNode := oXmlDocument:FindFirst( "item" ) DO WHILE oNode != NIL oNode := oXmlDocument:FindNext() ENDDO cConteudo:= oNode:cData // obtem o conteudo da ultima tag encontrada Quote Link to comment Share on other sites More sharing options...
wanderso Posted May 12, 2017 Author Report Share Posted May 12, 2017 Bom dia! Uma alternativa é fazer um While até achar a ultima tag. oNode := oXmlDocument:FindFirst( "item" ) DO WHILE oNode != NIL oNode := oXmlDocument:FindNext() ENDDO cConteudo:= oNode:cData // obtem o conteudo da ultima tag encontrada Valeu, é uma ideia também. Acabei fazendo uma função específica para isso, não tá 100% pois está lendo caracter a caracter mas está eficiente para o que quero que é retornar o conteúdo de uma ou mais tags dentro de determinado node. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.