Jump to content
Fivewin Brasil

Dúvida com xml


wanderso

Recommended Posts

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>

 

 

Link to comment
Share on other sites

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,

Link to comment
Share on other sites

 

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!

Link to comment
Share on other sites

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

Link to comment
Share on other sites

 

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. 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...