Jump to content
Fivewin Brasil

Classe para tratar XML


sambomb

Recommended Posts

Amiguinhos,

sambomb,

Precisa ser uma classe? e como voce disse, DO XML, voce foi específico mas não deu detalhes portanto vou responder conforme entendi.

   ...
   cXMLTotal := MemoRead( "meu.xml" )

   if empty(XMLGet( "logradouro", cRs ))
      MsgStop( "LOGRADOURO nao encontrado." ) 
      return .t.
   endif
   
   cXMLTexto := XMLGet( "logradouro", cRs )

   ? cXMLTexto
   
   return nil

No trecho acima, carrego um XML qualquer e com ajuda de uma função busco por uma determinada TAG.

Função XMLGet():

Function XMLGet( XMLField, XMLFile )
   XMLField    := alltrim( XMLField )
   XMLFieldINI := rat( "<"+XMLField+">", XMLFile ) + len( "<"+XMLField+">" ) 
   XMLFieldEND := rat( "", XMLFile ) - XMLFieldINI
   return alltrim(substr( XMLFile, XMLFieldINI, XMLFieldEND ))

Pra mim funciona que é uma beleza.

Quem sabe já te ajuda.

Em tempo, o forense mjuliao postou a seguinte contribuição, Leitura de XML Generico, que talvez seja exatamente o que desejas.

Link to comment
Share on other sites

Amiguinhos,

Eric, Eric, voce é o cara, ou seja, o mesmo cara, não muda. Gosto do seu jeito.

Se eu não fosse um cara que aprende com as criticas eu poderia pensar que, ...e não com funções de string..., fosse um desmerecimento pela tato alheio.

Analisei o código da HBXML e ó que loko, ela trata strings também!!!. Só não usa meios jurássicos como os que eu uso, mas usa.

Ainda não coloquei esta classe em uso em meus trabalhos, pois faço tratamento de XML usando tanto "strings" como DOM objects, mas fiz um bookmark de seus exemplos para know-how.

Link to comment
Share on other sites

<?xml version="1.0" encoding="ISO-8859-1" ?>
<tributacoes>
    <segmento>
        <detalhes>
            <ncm>2501.00.20</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>191</idSegmento>
            <nomeSegmento>Sal Refinado</nomeSegmento>
            <descricaoNcm>Sal de mesa</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>07/02/2013 10:56</dtCadastro>
            <dtUltimaAtualizacao>03/04/2013 14:15</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>0.00</icmsSaida>
            <icmsSituacao>Isento/Alíquota Zero</icmsSituacao>
            <icmsCstSaida>040</icmsCstSaida>
            <icmsLeiSaida>Lei 4892/2006</icmsLeiSaida>
            <icmsLeiLinkSaida>http://alerjln1.alerj.rj.gov.br/CONTLEI.NSF/0/797b7f8a3063a4d78325721f006764da?OpenDocument</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST> </subItemST>
            <mvaInterno>0.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 32.161 de 2002</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/portal/index.portal?_nfpb=true&_pageLabel=tributaria&file=/legislacao/tributaria/decretos/2002/32161.shtml</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
    <segmento>
        <detalhes>
            <ncm>2201.90.00</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>1467</idSegmento>
            <nomeSegmento>Gelo</nomeSegmento>
            <descricaoNcm>Outros gelo e neve</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>25/10/2013 16:48</dtCadastro>
            <dtUltimaAtualizacao>25/10/2013 16:48</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>0.00</icmsSaida>
            <icmsSituacao>ST - Substituição Tributária</icmsSituacao>
            <icmsCstSaida>060</icmsCstSaida>
            <icmsLeiSaida>ITEM 34,  Livro II, Anexo I,RICMS RJ</icmsLeiSaida>
            <icmsLeiLinkSaida>http://www.fazenda.rj.gov.br/portal/index.portal?_nfpb=true&_pageLabel=tributaria&file=/legislacao/tributaria/decretos/2000/ricms/index_livro_II.shtml</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST>1.5</subItemST>
            <mvaInterno>70.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 39.855/2006</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/sefaz/faces/oracle/webcenter/portalapp/pages/navigation-renderer.jspx?_afrLoop=118327526224000&datasource=UCMServer%23dDocName%3A81207&_adf.ctrl-state=lzncd73uj_32</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
    <segmento>
        <detalhes>
            <ncm>1905.90.90</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>361</idSegmento>
            <nomeSegmento>Alfajor</nomeSegmento>
            <descricaoNcm>(Tributado) Outros - Produtos de padaria, pastelaria ou da indústria de bolachas e biscoitos, mesmo adicionados de cacau e produtos semelhantes.</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>15/02/2013 11:49</dtCadastro>
            <dtUltimaAtualizacao>05/07/2014 13:09</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>19.00</icmsSaida>
            <icmsSituacao>Tributado</icmsSituacao>
            <icmsCstSaida>000</icmsCstSaida>
            <icmsLeiSaida>Lei 2.657, Artigo 14, Inciso I</icmsLeiSaida>
            <icmsLeiLinkSaida>http://alerjln1.alerj.rj.gov.br/contlei.nsf/f25edae7e64db53b032564fe005262ef/01cc04eee53b3b30032564fb005c2ddf?OpenDocument</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST> </subItemST>
            <mvaInterno>0.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 39.855/2006</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/sefaz/faces/oracle/webcenter/portalapp/pages/navigation-renderer.jspx?_afrLoop=118327526224000&datasource=UCMServer%23dDocName%3A81207&_adf.ctrl-state=lzncd73uj_32</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
    <segmento>
        <detalhes>
            <ncm>1905.90.90</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>23</idSegmento>
            <nomeSegmento>Bolo</nomeSegmento>
            <descricaoNcm>(Tributado) Outros - Produtos de padaria, pastelaria ou da indústria de bolachas e biscoitos, mesmo adicionados de cacau e produtos semelhantes.</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>15/01/2013 15:47</dtCadastro>
            <dtUltimaAtualizacao>24/02/2015 11:23</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>19.00</icmsSaida>
            <icmsSituacao>Tributado</icmsSituacao>
            <icmsCstSaida>000</icmsCstSaida>
            <icmsLeiSaida>Lei 2.657, Artigo 14, Inciso I</icmsLeiSaida>
            <icmsLeiLinkSaida>http://alerjln1.alerj.rj.gov.br/contlei.nsf/f25edae7e64db53b032564fe005262ef/01cc04eee53b3b30032564fb005c2ddf?OpenDocument</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST> </subItemST>
            <mvaInterno>0.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 39.855/2006</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/sefaz/faces/oracle/webcenter/portalapp/pages/navigation-renderer.jspx?_afrLoop=118327526224000&datasource=UCMServer%23dDocName%3A81207&_adf.ctrl-state=lzncd73uj_32</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
    <segmento>
        <detalhes>
            <ncm>1905.90.90</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>1292</idSegmento>
            <nomeSegmento>Palitos (de Chocolate)</nomeSegmento>
            <descricaoNcm>(Tributado) Outros - Produtos de padaria, pastelaria ou da indústria de bolachas e biscoitos, mesmo adicionados de cacau e produtos semelhantes.</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>13/09/2013 10:58</dtCadastro>
            <dtUltimaAtualizacao>11/02/2015 17:58</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>19.00</icmsSaida>
            <icmsSituacao>Tributado</icmsSituacao>
            <icmsCstSaida>000</icmsCstSaida>
            <icmsLeiSaida>Lei 2.657, Artigo 14, Inciso I</icmsLeiSaida>
            <icmsLeiLinkSaida>http://alerjln1.alerj.rj.gov.br/contlei.nsf/f25edae7e64db53b032564fe005262ef/01cc04eee53b3b30032564fb005c2ddf?OpenDocument</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST> </subItemST>
            <mvaInterno>0.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 39.855/2006</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/sefaz/faces/oracle/webcenter/portalapp/pages/navigation-renderer.jspx?_afrLoop=118327526224000&datasource=UCMServer%23dDocName%3A81207&_adf.ctrl-state=lzncd73uj_32</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
    <segmento>
        <detalhes>
            <ncm>1905.90.90</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>1138</idSegmento>
            <nomeSegmento>Pão de Mel (biscoito)</nomeSegmento>
            <descricaoNcm>(Tributado) Outros - Produtos de padaria, pastelaria ou da indústria de bolachas e biscoitos, mesmo adicionados de cacau e produtos semelhantes.</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>07/08/2013 12:05</dtCadastro>
            <dtUltimaAtualizacao>07/07/2014 16:10</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>19.00</icmsSaida>
            <icmsSituacao>Tributado</icmsSituacao>
            <icmsCstSaida>000</icmsCstSaida>
            <icmsLeiSaida>Lei 2.657, Artigo 14, Inciso I</icmsLeiSaida>
            <icmsLeiLinkSaida>http://alerjln1.alerj.rj.gov.br/contlei.nsf/f25edae7e64db53b032564fe005262ef/01cc04eee53b3b30032564fb005c2ddf?OpenDocument</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST> </subItemST>
            <mvaInterno>0.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 39.855/2006</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/sefaz/faces/oracle/webcenter/portalapp/pages/navigation-renderer.jspx?_afrLoop=118327526224000&datasource=UCMServer%23dDocName%3A81207&_adf.ctrl-state=lzncd73uj_32</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
    <segmento>
        <detalhes>
            <ncm>1905.90.90</ncm>
            <ncm_ex> </ncm_ex>
            <idSegmento>1445</idSegmento>
            <nomeSegmento>Pão de Mel (Bolacha)</nomeSegmento>
            <descricaoNcm>(Tributado) Outros - Produtos de padaria, pastelaria ou da indústria de bolachas e biscoitos, mesmo adicionados de cacau e produtos semelhantes.</descricaoNcm>
            <tipoProduto>sem ean</tipoProduto>
            <observacao> </observacao>
            <dtCadastro>24/10/2013 09:54</dtCadastro>
            <dtUltimaAtualizacao>28/06/2014 19:47</dtUltimaAtualizacao>
        </detalhes>
        <saida>
            <icmsSaida>19.00</icmsSaida>
            <icmsSituacao>Tributado</icmsSituacao>
            <icmsCstSaida>000</icmsCstSaida>
            <icmsLeiSaida>Lei 2.657, Artigo 14, Inciso I</icmsLeiSaida>
            <icmsLeiLinkSaida>http://alerjln1.alerj.rj.gov.br/contlei.nsf/f25edae7e64db53b032564fe005262ef/01cc04eee53b3b30032564fb005c2ddf?OpenDocument</icmsLeiLinkSaida>
            <ipi>0.00</ipi>
        </saida>
        <entrada>
            <ufDestino>RJ</ufDestino>
            <subItemST> </subItemST>
            <mvaInterno>0.00</mvaInterno>
            <mvaExterno>0.00</mvaExterno>
            <mvaImportado>0.00</mvaImportado>
            <baseReduzida>0.00</baseReduzida>
            <icmsInterno>19.00</icmsInterno>
            <icmsLeiInterno>Decreto 39.855/2006</icmsLeiInterno>
            <icmsLeiLinkInterno>http://www.fazenda.rj.gov.br/sefaz/faces/oracle/webcenter/portalapp/pages/navigation-renderer.jspx?_afrLoop=118327526224000&datasource=UCMServer%23dDocName%3A81207&_adf.ctrl-state=lzncd73uj_32</icmsLeiLinkInterno>
            <icmsAtacadoAC>12.00</icmsAtacadoAC>
            <icmsIndustriaAC>12.00</icmsIndustriaAC>
            <icmsAtacadoAL>12.00</icmsAtacadoAL>
            <icmsIndustriaAL>12.00</icmsIndustriaAL>
            <icmsAtacadoAM>12.00</icmsAtacadoAM>
            <icmsIndustriaAM>12.00</icmsIndustriaAM>
            <icmsAtacadoAP>12.00</icmsAtacadoAP>
            <icmsIndustriaAP>12.00</icmsIndustriaAP>
            <icmsAtacadoBA>12.00</icmsAtacadoBA>
            <icmsIndustriaBA>12.00</icmsIndustriaBA>
            <icmsAtacadoCE>12.00</icmsAtacadoCE>
            <icmsIndustriaCE>12.00</icmsIndustriaCE>
            <icmsAtacadoDF>12.00</icmsAtacadoDF>
            <icmsIndustriaDF>12.00</icmsIndustriaDF>
            <icmsAtacadoES>12.00</icmsAtacadoES>
            <icmsIndustriaES>12.00</icmsIndustriaES>
            <icmsAtacadoGO>12.00</icmsAtacadoGO>
            <icmsIndustriaGO>12.00</icmsIndustriaGO>
            <icmsAtacadoMA>12.00</icmsAtacadoMA>
            <icmsIndustriaMA>12.00</icmsIndustriaMA>
            <icmsAtacadoMG>12.00</icmsAtacadoMG>
            <icmsIndustriaMG>12.00</icmsIndustriaMG>
            <icmsAtacadoMS>12.00</icmsAtacadoMS>
            <icmsIndustriaMS>12.00</icmsIndustriaMS>
            <icmsAtacadoMT>12.00</icmsAtacadoMT>
            <icmsIndustriaMT>12.00</icmsIndustriaMT>
            <icmsAtacadoPA>12.00</icmsAtacadoPA>
            <icmsIndustriaPA>12.00</icmsIndustriaPA>
            <icmsAtacadoPB>12.00</icmsAtacadoPB>
            <icmsIndustriaPB>12.00</icmsIndustriaPB>
            <icmsAtacadoPE>12.00</icmsAtacadoPE>
            <icmsIndustriaPE>12.00</icmsIndustriaPE>
            <icmsAtacadoPI>12.00</icmsAtacadoPI>
            <icmsIndustriaPI>12.00</icmsIndustriaPI>
            <icmsAtacadoPR>12.00</icmsAtacadoPR>
            <icmsIndustriaPR>12.00</icmsIndustriaPR>
            <icmsAtacadoRJ>19.00</icmsAtacadoRJ>
            <icmsIndustriaRJ>19.00</icmsIndustriaRJ>
            <icmsAtacadoRN>12.00</icmsAtacadoRN>
            <icmsIndustriaRN>12.00</icmsIndustriaRN>
            <icmsAtacadoRO>12.00</icmsAtacadoRO>
            <icmsIndustriaRO>12.00</icmsIndustriaRO>
            <icmsAtacadoRR>12.00</icmsAtacadoRR>
            <icmsIndustriaRR>12.00</icmsIndustriaRR>
            <icmsAtacadoRS>12.00</icmsAtacadoRS>
            <icmsIndustriaRS>12.00</icmsIndustriaRS>
            <icmsAtacadoSC>12.00</icmsAtacadoSC>
            <icmsIndustriaSC>12.00</icmsIndustriaSC>
            <icmsAtacadoSE>12.00</icmsAtacadoSE>
            <icmsIndustriaSE>12.00</icmsIndustriaSE>
            <icmsAtacadoSP>12.00</icmsAtacadoSP>
            <icmsIndustriaSP>12.00</icmsIndustriaSP>
            <icmsAtacadoTO>12.00</icmsAtacadoTO>
            <icmsIndustriaTO>12.00</icmsIndustriaTO>
        </entrada>
        <federal>
            <piscofinsSituacao>Tributado</piscofinsSituacao>
            <piscofinsCstEntrada>50</piscofinsCstEntrada>
            <piscofinsCstSaida>01</piscofinsCstSaida>
            <pisEntrada>1.650</pisEntrada>
            <cofinsEntrada>7.600</cofinsEntrada>
            <pisSaida>1.650</pisSaida>
            <cofinsSaida>7.600</cofinsSaida>
            <piscofinsLei> </piscofinsLei>
            <piscofinsLeiLink> </piscofinsLeiLink>
            <piscofinsNatRec> </piscofinsNatRec>
        </federal>
        <tipoLista> </tipoLista>
    </segmento>
        <excecoes>
        <excecaoEstado>
            <excecaoUF>ES</excecaoUF>
            <excecaoNome>beneficio</excecaoNome>
            <excecaoAtacado>1.00</excecaoAtacado>
            <excecaoIndustria>12.00</excecaoIndustria>
        </excecaoEstado>
    </excecoes>
    <importados>
        <aliquotaInterestadual>4.00</aliquotaInterestadual>
        <prefixo num="1">Estrangeira - Importação direta, exceto a indicada no código 6</prefixo>
        <prefixo num="2">Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7</prefixo>
        <prefixo num="6">Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX (vide Resolução Camex 79/2012)</prefixo>
        <prefixo num="7">Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX (vide Resolução Camex 79/2012)</prefixo>
    </importados>
    <totalSegmentos>63</totalSegmentos>
    <dtSolicitacao>08/05/2015 15:57</dtSolicitacao>
    <chaveControle>c87783e2bf362d</chaveControle>
</tributacoes>

Exemplo do XML que preciso tratar para facilitar o entendimento.

Ola Boa noite

Samir no projeto HB_NFE tem um tratamento do XML da NFE para impressão na FAST, de repente te ajude.

Espero ter ajudado.

Já analisei, mas o tratamento ali é muito especifico, preciso de algo mais genérico e preferencialmente dinâmico, onde eu não necessite de conhecimento prévio das tags para obter os valores.

Amiguinhos,

sambomb,

Precisa ser uma classe? e como voce disse, DO XML, voce foi específico mas não deu detalhes portanto vou responder conforme entendi.

   ...
   cXMLTotal := MemoRead( "meu.xml" )

   if empty(XMLGet( "logradouro", cRs ))
      MsgStop( "LOGRADOURO nao encontrado." ) 
      return .t.
   endif
   
   cXMLTexto := XMLGet( "logradouro", cRs )

   ? cXMLTexto
   
   return nil

No trecho acima, carrego um XML qualquer e com ajuda de uma função busco por uma determinada TAG.

Função XMLGet():

Function XMLGet( XMLField, XMLFile )
   XMLField    := alltrim( XMLField )
   XMLFieldINI := rat( "<"+XMLField+">", XMLFile ) + len( "<"+XMLField+">" ) 
   XMLFieldEND := rat( "", XMLFile ) - XMLFieldINI
   return alltrim(substr( XMLFile, XMLFieldINI, XMLFieldEND ))

Pra mim funciona que é uma beleza.

Quem sabe já te ajuda.

Em tempo, o forense mjuliao postou a seguinte contribuição, Leitura de XML Generico, que talvez seja exatamente o que desejas.

Não me serve pois tenho muitas tags repetidas e aninhadas, no exemplo acima vai ver que o grupo <segmento> se repete diversas vezes ( esse exemplo está resumido tem arquivos que vão ter mais de 1000 segmentos ) e queria tratar eles em uma matriz para facilitar o tratamento, mas preciso de uma classe que me permita obter os dados para jogar na matriz.

No Hash do exemplo do Juliao do jeito que está não tem como eu tratar pois não vou ter uma estrutura que me permita usar repetição ( For/While/Repeat )

Simples, a forma mais apropriada para manipular (ler/criar) a estrutura de qualquer arquivo XML, é com as classes TXmlDocument/TXmlNode, e não com funções de string, etc. veja os exemplos.

Eric, já tentei usar ela mas sem sucesso, não consegui compreender como tratar para trabalhar com multiplos Nodes homônimos, com vários níveis de profundidade.

Segue um exemplo:

Existem diversos <segmento>, dentro de cada um tenho um <detalhes> e a informação está dentro desse Node.

Até onde eu entendi, a classe TXmlDocument() gera um Node no findFirst ou Next, mas tenho que dar um Find no Segmento e precisaria usar esse Node para dar um Find em <detalhes>, <entrada>, <saida>, etc e só então pegar as informações.

O problema é que a classe Node não tem opção de Find.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<tributacoes>
	<segmento>
		<detalhes>
			<ncm>2501.00.20</ncm>
		</detalhes>
		<saida>
			<icmsSaida>0.00</icmsSaida>
		</saida>
		<entrada>
			<ufDestino>RJ</ufDestino>
		</entrada>
		<federal>
			<piscofinsSituacao>Tributado</piscofinsSituacao>
		</federal>
		<tipoLista> </tipoLista>
	</segmento>
	<segmento>
		<detalhes>
			<ncm>2201.90.00</ncm>
			...
Link to comment
Share on other sites

Amiguinhos,


Vou reproduzir um post de 2009 que dá uma alusão mais direta a necessidade do forense sambomb.


Quem não conhece o termo EDI, Eletronic Data Interchange, termo bonito para o que conhecemos como transferência de arquivos.


No meu caso uso em meu sistema para fazer envio de informações entre filiais de meus clientes.


Para tanto faço uso de arquivos formatados em .XML e só mudo a extensão para diferenciar e não misturar com os tantos arquivos manipulados pelo mesmo.


No exemplo a seguir simulo a geração de um arquivo contendo dados de um cliente e os itens de seu orçamento, que depois de tratados pelo modulo de recebimento atualiza/inclui o cliente no cadastro e inclui um pedido na carteira de vendas.


Vejam que o codigo é bem limpo, e de fácil assimilação e o .XML gerado segue uma estrutura bem definida.


Para gerar a primeira parte usei a classe TXMLWrite( Fred ) e fiz pequeninas mudanças para continuar usando a classe original para outras coisas.


A segunda parte do exemplo apresenta como interpretar um conteudo .XML e obter as informações. Para isto é necessário que o MS XML Toolkit ou MSXML4 esteja instalado.



/*
*
* Teste de integracao XML atraves de arquivos EDX
*
*/
#include "FiveWin.ch"
#include "edx.ch"

#define CR Chr(13)
#define LF Chr(10)

#define BS "\"

Function main()
LOCAL cEDX, cHomeDir
LOCAL cFile, cDOCFile, cXMLFile

PUBLIC oEDX

cXMLFile := "TESTEDX.EDX"

if ! file( cXMLFile )
EDX oEDX FILE cXMLFile FORMATED
EDX OPEN MARK "pedido" ATTRIB "Database" VALUE "25709" OF oEDX
EDX OPEN MARK "cliente" ATTRIB "idcliente" VALUE "803" OF oEDX
EDX OPEN MARK "nome" TYPE "" TAG "JOSE CARLOS DA ROCHA" AUTOCLOSE OF oEDX
EDX OPEN MARK "endereco" TYPE "" TAG "RUA DR MARIO MAURO RAMOS MATTOSO 50" AUTOCLOSE OF oEDX
EDX OPEN MARK "bairro" TYPE "" TAG "PIRITUBA" AUTOCLOSE OF oEDX
EDX OPEN MARK "cidade" TYPE "" TAG "SAO PAULO" AUTOCLOSE OF oEDX
EDX OPEN MARK "estado" TYPE "" TAG "SP" AUTOCLOSE OF oEDX
EDX OPEN MARK "cep" TYPE "" TAG "05171-340" AUTOCLOSE OF oEDX
EDX OPEN MARK "telefone" TYPE "" TAG "(011)3534-3099" AUTOCLOSE OF oEDX
EDX OPEN MARK "cgc" TYPE "" TAG "000.000.000-000" AUTOCLOSE OF oEDX
EDX OPEN MARK "inscr" TYPE "" TAG "00.000.000" AUTOCLOSE OF oEDX
EDX CLOSE MARK OF oEDX // cliente
//
EDX OPEN MARK "item" ATTRIB "Numero" VALUE "1" OF oEDX
EDX OPEN MARK "dataped" TYPE "" TAG "20080926" AUTOCLOSE OF oEDX
EDX OPEN MARK "resumido" TYPE "" TAG "AC1000" AUTOCLOSE OF oEDX
EDX OPEN MARK "descricao" TYPE "" TAG "PRODUTO AC 1000" AUTOCLOSE OF oEDX
EDX OPEN MARK "quantidade" TYPE "" TAG "1.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "valor" TYPE "" TAG "13.600" AUTOCLOSE OF oEDX
EDX OPEN MARK "desconto" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "medidas" OF oEDX
EDX OPEN MARK "largura" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "altura" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "compriment" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX CLOSE MARK OF oEDX // medidas
EDX CLOSE MARK OF oEDX // item
//
EDX OPEN MARK "item" ATTRIB "Numero" VALUE "2" OF oEDX
EDX OPEN MARK "dataped" TYPE "" TAG "20081214" AUTOCLOSE OF oEDX
EDX OPEN MARK "resumido" TYPE "" TAG "AC1020" AUTOCLOSE OF oEDX
EDX OPEN MARK "descricao" TYPE "" TAG "PRODUTO AC 1020" AUTOCLOSE OF oEDX
EDX OPEN MARK "quantidade" TYPE "" TAG "3.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "valor" TYPE "" TAG "5.400" AUTOCLOSE OF oEDX
EDX OPEN MARK "desconto" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "medidas" OF oEDX
EDX OPEN MARK "largura" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "altura" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX OPEN MARK "compriment" TYPE "" TAG "0.000" AUTOCLOSE OF oEDX
EDX CLOSE MARK OF oEDX // medidas
EDX CLOSE MARK OF oEDX // item
EDX CLOSE MARK OF oEDX // pedido
EDX END oEDX
//
endif

cMethod := "POST"
cURL := "http://www.f2b.com.br/WSBilling"

oEDXSend := TOLEAuto():New( "Microsoft.XMLHTTP" )

//oEDXSend:Open( cMethod, cURL, .F. )
//oEDXSend:Send( cXMLFile )
//cEDXBuffer := oEDXSend:ResponseText

cHomeDir := CurDrive() + ":" + BS + CurDir() + BS

cFile := cHomeDir + cXMLFile

oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM")
oXMLDoc:async := .f.

lSuccess := oXMLDoc:load( cXMLFile )

if lSuccess

x := oXMLDoc:getElementsByTagName( "cliente" )
? oXMLDoc:getElementsByTagName( "nome" ):Item(0):Text , ;
oXMLDoc:getElementsByTagName( "endereco" ):Item(0):Text, ;
oXMLDoc:getElementsByTagName( "bairro" ):Item(0):Text , ;
oXMLDoc:getElementsByTagName( "cidade" ):Item(0):Text , ;
oXMLDoc:getElementsByTagName( "estado" ):Item(0):Text , ;
oXMLDoc:getElementsByTagName( "cep" ):Item(0):Text , ;
oXMLDoc:getElementsByTagName( "telefone" ):Item(0):Text, ;
oXMLDoc:getElementsByTagName( "cgc" ):Item(0):Text , ;
oXMLDoc:getElementsByTagName( "inscr" ):Item(0):Text

x := oXMLDoc:getElementsByTagName( "item" )
for i = 1 to x:length
? oXMLDoc:getElementsByTagName( "dataped" ):Item(i-1):Text , ;
oXMLDoc:getElementsByTagName( "descricao" ):Item(i-1):Text , ;
oXMLDoc:getElementsByTagName( "resumido" ):Item(i-1):Text , ;
oXMLDoc:getElementsByTagName( "quantidade" ):Item(i-1):Text, ;
oXMLDoc:getElementsByTagName( "valor" ):Item(i-1):Text , ;
oXMLDoc:getElementsByTagName( "desconto" ):Item(i-1):Text
next

else
? "erro de abertura"
endif

return nil

#include "edx.prg"


Para completar o exemplo segue os codigos de suporte, EDX.CH:


#xcommand EDX <oEDX> FILE <cOut> ;
[ VERSION <cVer> ] ;
[ ENCODING <cEncode> ] ;
[ STYLESHEET <cSheet> ] ;
[ <lFormated:FORMATED> ];
=> ;
<oEDX> := TEDXWrite():New( <cOut>, <cVer>, <cEncode>, <cSheet>, <.lFormated.> )

#xcommand EDX OPEN MARK <cMark> [ TYPE <cType> ] ;
[ ATTRIB <cAttrib1> VALUE <uVal1> ;
[ ATTRIB <cAttrib2> VALUE <uValN> ]] ;
[ EXTENDED <uExt> ] ;
[ TAG <cTag> ] ;
[ <lAutoClose:AUTOCLOSE> ];
<of: OF> <oEDX> ;
=> ;
<oEDX>:Open( <cMark>, <cType>,;
{ [ { <cAttrib1> ,<uVal1> } ] [, { <(cAttrib2)> ,<(uValN)>} ] },;
<cTag>, <.lAutoClose.>, <uExt>)

#xcommand EDX CLOSE MARK <of: OF> <oEDX> ;
=> ;
<oEDX>:Close( )

#xcommand EDX SEND <cXMLDoc> ;
URL <cURL> ;
METHOD <cMethod> ;
<of: OF> <oEDX> ;
=> ;
<oEDX>:Send( <cMethod>, <cURL>, <cXMLDoc> )

#xcommand EDX END <oEDX> ;
=> ;
<oEDX>:End()


Codigo da classe, EDX.PRG:


*******************************************************************************
* Pruebas para la creacion de fichero xml desde fivewin *
* 01 - 05 - 2002 *
* Enviarme vuestras dudas y sugerencias a fredy@airtel.net *
*******************************************************************************

#include "objects.ch"
#include "fileio.ch"
#xcommand DEFAULT <uVar1> := <uVal1> ;
[, <uVarN> := <uValN> ] => ;
If( <uVar1> == nil, <uVar1> := <uVal1>, ) ;;
[ If( <uVarN> == nil, <uVarN> := <uValN>, ); ]

CLASS TEDXWRITE
DATA hFile, lFormated, cCRLF, aMark
METHOD New( cOut, cVer, cEncode, cSheet, lFormated ) CONSTRUCTOR
METHOD Open( cMark, cType, aAttrib, cTag, lClose, cExt )
METHOD End()
METHOD Procesar( cText )
METHOD Send( cMethod, cURL, cXMLDoc )
METHOD Close()
ENDCLASS

METHOD New( cOut, cVer, cEncode, cSheet, lFormated ) CLASS TEDXWRITE
DEFAULT cVer := "1.0"
DEFAULT cEncode := "ISO-8859-1"
//DEFAULT
::lFormated := .t.
::cCRLF := If( lFormated, Chr(13)+Chr(10), "" )
::aMark := {}
::hFile := FCreate( AllTrim( cOut ), 0 )
::Procesar( '<?xml version="' + cVer + '" encoding="' + cEncode + '"?>' )
IF !Empty( cSheet )
::Procesar( '<?xml-stylesheet href="'+ AllTrim( cSheet ) + '" Type="text/xsl"?>' )
END IF
Return( Self )

METHOD Open( cMark, cType, aAttrib, cTag, lClose, cExt ) CLASS TEDXWRITE
Local n, cBuffer
DEFAULT cTag := ""
DEFAULT cType := ""
DEFAULT cExt := ""
aAdd( ::aMark, cMark )
cBuffer := '<' + cMark
//IF Len( ::aMark ) == 1
// cBuffer += ' xmlns:dt="urn:schemas-microsoft-com:datatypes"'
// xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//END IF
IF !Empty( cType )
cBuffer += ' dt:dt= "' + cType + '"'
END IF
IF Len( aAttrib ) > 0
FOR n := 1 TO Len( aAttrib )
cBuffer += ' '+ aAttrib[n,1] + ' = "' + aAttrib[n,2] + '" '
NEXT
END IF
cBuffer += '>' + alltrim( cTag ) + If( lClose, '</' + cMark + '>' , "" )
::Procesar( cBuffer )
IF lClose
aSize( ::aMark, Len( ::aMark ) -1 )
END IF

METHOD Close() CLASS TEDXWRITE
::Procesar( "</" + ::aMark[ Len( ::aMark ) ] + ">" )
aSize( ::aMark, Len( ::aMark ) -1 )

METHOD End() CLASS TEDXWRITE
::Procesar( "" ) // "</xml>" )
FClose( ::hFile )

METHOD Send( cMethod, cURL, cXMLDoc ) CLASS TEDXWRITE
oEDXSend := TOLEAuto():New( "Microsoft.XMLHTTP" )
oEDXSend:Open( cMethod, cURL, .F. )
oEDXSend:Send( cXMLDoc )
//cEDXBuffer := oEDXSend:ResponseText
return "" // cEDXBuffer

METHOD Procesar( cBuffer ) CLASS TEDXWRITE
Local nSpaces := If( ::lFormated, Len( ::aMark ), 0 )
cBuffer := Space( nSpaces )+ cBuffer + ::cCRLF
FWrite( ::hFile, cBuffer, Len( cBuffer ) )
return

Link to comment
Share on other sites

Amiguinhos,

Vejamos o tratamento que dariamos ao .XML em questão usando as dicas acima:

...
    <segmento>
        <detalhes>
            ...
        </detalhes>
        <saida>
            ...
        </saida>
        <entrada>
        ...
    </segmento>
    <segmento>
        ...

Exemplificando:

oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM") 
   oXMLDoc:async := .f. 
 
   lSuccess := oXMLDoc:load( cXMLFile )
 
   if lSuccess
      ...
      // Farei a leitura de quantos segmentos houverem
      nSegmentos := oXMLDoc:getElementsByTagName( "segmento" ) 
      for i = 1 to nSegmentos:length 
          ... // Pega XML do trecho 
          cXMLDetalhes := oXMLDoc:getElementsByTagName( "Detalhes" ):Item(i-1):xml 
          ...
          // Dou tratamento ao xml resgatado em cXMLDetalhes
          ...
          cXMLSaida := oXMLDoc:getElementsByTagName( "Saida" ):Item(i-1):xml
          ...
          // Dou tratamento ao xml resgatado em cXMLSaida
          ...
          cXMLEntrada := oXMLDoc:getElementsByTagName( "Entrada" ):Item(i-1):xml
          ...
          // Dou tratamento ao xml resgatado em cXMLEntrada
          ...

Outra coisa que se deve levar em consideração é o fato de uma tag não existir no .XML, por padrão ao escrever o conteúdo de um arquivo assim é melhor que exista conteúdo, mas muitas vezes encontramos "lixo" que nos atrapalham como <TagIncompleta /> ou <TagVazia></TagVazia>. Nos dois caso só nos faz perder tempo em processamento mas ainda assim devemos tratar e para tal é necessário criticar se a tag existe.

Neste caso posso fazer de duas formas:

Via DOM:

...
   cXMLDoc  := MemoRead( cEDXFile )
   
   oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM")
   oXMLDoc:async := .f. 

   lSuccess := oXMLDoc:load( cEDXFile )

   if lSuccess

      oteste := oXMLDoc:getElementsByTagName( "segmento" )
	  
      lExisteTagDetalhes := CriticaTagName( "detalhes", oXMLDoc, cXMLDoc )
      lExisteTagSaida    := CriticaTagName( "saida", oXMLDoc, cXMLDoc )
      ...

Function CriticaTagName( _tagName_, oXMLDoc, cXMLDoc )
   if upper( "<"+_tagName_+">" ) $ upper( cXMLDoc )
      _cTagName_ := oXMLDoc:getElementsByTagName( _tagName_ ):Item(0):Text
   else
      _cTagName_ := ""
   endif
   return _cTagName_

Via STRING:

...
   cXMLDoc  := MemoRead( cEDXFile )

   if ! empty( cXMLDoc )
   
      lExisteTagDetalhes := ValidaXMLField( "Detalhes", cXMLDoc )
      lExisteTagSaida    := ValidaXMLField( "Saida"   , cXMLDoc )
      ...

function ValidaXMLField( _XMLField_, _XMLFile_ )
   return iif( AT( "<"+_XMLField_+">", _XMLFile_ ) > 0, .t., .f. )

Link to comment
Share on other sites

Amiguinhos,

Vejamos o tratamento que dariamos ao .XML em questão usando as dicas acima:

...
    <segmento>
        <detalhes>
            ...
        </detalhes>
        <saida>
            ...
        </saida>
        <entrada>
        ...
    </segmento>
    <segmento>
        ...

Exemplificando:

oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM") 
   oXMLDoc:async := .f. 
 
   lSuccess := oXMLDoc:load( cXMLFile )
 
   if lSuccess
      ...
      // Farei a leitura de quantos segmentos houverem
      nSegmentos := oXMLDoc:getElementsByTagName( "segmento" ) 
      for i = 1 to nSegmentos:length 
          ... // Pega XML do trecho 
          cXMLDetalhes := oXMLDoc:getElementsByTagName( "Detalhes" ):Item(i-1):xml 
          ...
          // Dou tratamento ao xml resgatado em cXMLDetalhes
          ...
          cXMLSaida := oXMLDoc:getElementsByTagName( "Saida" ):Item(i-1):xml
          ...
          // Dou tratamento ao xml resgatado em cXMLSaida
          ...
          cXMLEntrada := oXMLDoc:getElementsByTagName( "Entrada" ):Item(i-1):xml
          ...
          // Dou tratamento ao xml resgatado em cXMLEntrada
          ...

Outra coisa que se deve levar em consideração é o fato de uma tag não existir no .XML, por padrão ao escrever o conteúdo de um arquivo assim é melhor que exista conteúdo, mas muitas vezes encontramos "lixo" que nos atrapalham como <TagIncompleta /> ou <TagVazia></TagVazia>. Nos dois caso só nos faz perder tempo em processamento mas ainda assim devemos tratar e para tal é necessário criticar se a tag existe.

Neste caso posso fazer de duas formas:

Via DOM:

...
   cXMLDoc  := MemoRead( cEDXFile )
   
   oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM")
   oXMLDoc:async := .f. 

   lSuccess := oXMLDoc:load( cEDXFile )

   if lSuccess

      oteste := oXMLDoc:getElementsByTagName( "segmento" )
	  
      lExisteTagDetalhes := CriticaTagName( "detalhes", oXMLDoc, cXMLDoc )
      lExisteTagSaida    := CriticaTagName( "saida", oXMLDoc, cXMLDoc )
      ...

Function CriticaTagName( _tagName_, oXMLDoc, cXMLDoc )
   if upper( "<"+_tagName_+">" ) $ upper( cXMLDoc )
      _cTagName_ := oXMLDoc:getElementsByTagName( _tagName_ ):Item(0):Text
   else
      _cTagName_ := ""
   endif
   return _cTagName_

Via STRING:

...
   cXMLDoc  := MemoRead( cEDXFile )

   if ! empty( cXMLDoc )
   
      lExisteTagDetalhes := ValidaXMLField( "Detalhes", cXMLDoc )
      lExisteTagSaida    := ValidaXMLField( "Saida"   , cXMLDoc )
      ...

function ValidaXMLField( _XMLField_, _XMLFile_ )
   return iif( AT( "<"+_XMLField_+">", _XMLFile_ ) > 0, .t., .f. )

Era basicamente isso que eu procurava, vou tratar em métodos em uma classe para poder facilitar o entendimento agora e tendo sucesso aviso aqui, muito obrigado!

Link to comment
Share on other sites

/***************************************************************************
* Sistema .....: Farma
* Programa ....: AvantFiscal.PRG
* Autor .......: Samir
* Data ........: 06/05/2015 às 14:15:31
* Revisado em .: 06/05/2015 às 14:15:31
***************************************************************************/

#include "fivewin.ch"
#include "fileio.ch"
#include "hbxml.ch"

CLASS TComunicaXML

   //-- Propriedades -----------------------------------------------------//
   DATA cUrl                  AS Character   INIT ""

   Data oXml                  AS OBJECT
   Data oXml_Segmento         AS OBJECT

   Data oNode                 AS OBJECT

   Data cFileRetorno          AS Character   INIT ""

   Data oConecta              AS OBJECT
   Data cRetorno              AS Character   INIT ""

   Data aResult               AS Array       INIT {}

   //-- Métodos ----------------------------------------------------------//

   //-- Construção
   METHOD New()                                                CONSTRUCTOR
   METHOD End()

   METHOD Comunicar()

   METHOD Tratar_Retorno()
   METHOD Tratar_XML()
   METHOD Tratar_Segmento()
   METHOD Tratar_Detalhes()
   METHOD Tratar_Saida()
   METHOD Tratar_Entrada()
   METHOD Tratar_Federal()
   METHOD Tratar_Excecoes()
   METHOD Tratar_ExcecaoEstado()
   METHOD Tratar_Importados()

   METHOD VerificaTag(cTag)
   METHOD PegaTag(cTag)

ENDCLASS

/*------------------------------------------------------------------------*/

****************************************************************************
METHOD New(cIdIntegracao, cIdCliente, cToken, cUrl) CLASS TComunicaXML
****************************************************************************
*
* Instanciar objeto
* Parametros: cIdIntegracao, cIdCliente, cToken, cUrl
* Retorno: Self (Object)
*
* Autor .......: Samir
* Data ........: 06/05/2015 às 14:15:31
*
****************************************************************************

return Self

/*------------------------------------------------------------------------*/

****************************************************************************
METHOD End() CLASS TComunicaXML
****************************************************************************
*
* Liberar da memória o objeto
* Parametros: Nenhum
* Retorno: Nil
*
* Autor .......: Samir
* Data ........: 06/05/2015 às 14:15:31
*
****************************************************************************

   Self := Nil

return nil

/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Comunicar() CLASS TComunicaXML
****************************************************************************
*
* Comunicar no webservice
* Parametros: 
* Retorno: lResult
*
* Autor: Samir
* 06/05/2015 - 14:16:50
*
****************************************************************************

local lResult := .T., cUrl := "", nContador := 0

   //-- Limpar variável de retorno no inicio para caso gere erro não mantenha o anterior
   ::cRetorno := ""

   //-- Preencher a URL do webservice
   cUrl := ::cUrl

   //-- Instanciar o objeto do Internet Explorer
   Try

      ::oConecta := CreateObject( "MSXML2.XMLHTTP.3.0" )

   Catch

      Try

         ::oConecta := CreateObject( "MSXML2.XMLHTTP" )

      Catch

         Try

            ::oConecta := CreateObject( "Microsoft.XMLHTTP" )

         catch

            MsgInfo("Falha ao criar objeto de conexão."+ CRLF + "Verifique a versão do Internet Explorer e a conexão de internet.")

            Return .F.

         End

      End

   End

   //-- configura os parametros do wsdl
   ::oConecta:open("GET", cUrl, .F.)

   ::oConecta:SetRequestHeader( "Content-Type" , "text/xml; charset=ISO-8859-1" )

   //-- envia o request
   TRY

      ::oConecta:send()

   CATCH oError

      MsgInfo("Erro ao conectar ao site:;" + ::cUrl + CRLF + "Verifique a versão do Internet Explorer e a conexão de internet.")

      Return .f.

   END

   //-- aguarda alguns segundos a resposta
   While ::oConecta:readyState <> 4

      millisec(50)

      SysRefresh()

      nContador++

      //-- Teste para não permitir loop infinito
      If nContador > 100

         MsgInfo("Tempo limite de conexão atingido, verifique.")

         Return .F.

      End

   End

   //-- Gravar o retorno na variável
   ::cRetorno := ::oConecta:ResponseBody

   ::Tratar_Retorno()

return lResult
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Retorno() CLASS TComunicaXML
****************************************************************************
*
* Tratar retorno do site
* Parametros:
* Retorno:
*
* Autor: Samir
* 07/05/2015 - 16:39:02
*
****************************************************************************

local hHandle := 0, oXml

   ::cFileRetorno := DirExe() + "RetornoAF_"+StrTran(Now(),":")+".xml"

   FWrite( FCreate(::cFileRetorno), ::cRetorno)

   hHandle := FOpen( ::cFileRetorno )

   IF hHandle == -1

     MsgInfo("Não foi possível abrir o XML!")

   Else

      ::oXml := TXmlDocument():New( hHandle )

      IF ::oxml:nStatus != HBXML_STATUS_OK

         MsgInfo("Erro ao processar o arquivo:" + CRLF +;
             "na Linha: " + AllTrim( Str( oxml:nLine ) ) + CRLF +;
             "Erro: " + HB_XmlErrorDesc( oxml:nError ) + CRLF +;
             "Erro na Tag: " + oxml:oErrorNode:cName + CRLF +;
             "Início Tag na linha: " + AllTrim( Str( oxml:oErrorNode:nBeginLine ) ))

      Else

         ::Tratar_Xml( )

         MsgInfo("Arquivo válido, verifique")

      End

   End

   fClose( hHandle )

   fErase( ::cFileRetorno )

   ::cFileRetorno := ""

return
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_XML() CLASS TComunicaXML
****************************************************************************
*
* Tratar o XML para obter as informações por segmento
* Parametros: oXml
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:36:19
*
****************************************************************************

local oSegmento, nContador := 0, cResultado := ""

   ::oXml := TOLEAUTO():New("Microsoft.XMLDOM")
   ::oXml:async := .f.

   If ::oXml:load( ::cFileRetorno )

      If ::VerificaTag( "segmento" )

         ::oXML_Segmento := ::oXml:getElementsByTagName( "segmento" )

         for nContador := 1 to ::oXml_Segmento:length

            ::Tratar_Segmento(nContador)

         End

      End

   End

   For nContador := 1 to Len(::aResult)
      cResultado += ::aResult[nContador,1] + " NCM: " + ::aResult[nContador,2] + CRLF
   End
   
   MsgInfo(cResultado)

   MsgInfo("Fim")

return
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Segmento(nContador) CLASS TComunicaXML
****************************************************************************
*
* Tratar retorno de segmento do XML
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:51:07
*
****************************************************************************
Local lResult := .T.

   If ::VerificaTag( "detalhes" ) .And. lResult

      lResult := ::Tratar_Detalhes(nContador)

   End

   If ::VerificaTag( "saida" ) .And. lResult

      lResult := ::Tratar_Saida(nContador)

   End

   If ::VerificaTag( "entrada" ) .And. lResult

      lResult := ::Tratar_Entrada(nContador)

   End

   If ::VerificaTag( "federal" ) .And. lResult

      lResult := ::Tratar_Federal(nContador)

   End

return
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Detalhes(nContador) CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************
//<detalhes>
//<ncm>2501.00.20</ncm>
//<ncm_ex> </ncm_ex>
//<idSegmento>191</idSegmento>
//<nomeSegmento>Sal Refinado</nomeSegmento>
//<descricaoNcm>Sal de mesa</descricaoNcm>
//<tipoProduto>sem ean</tipoProduto>
//<observacao> </observacao>
//<dtCadastro>07/02/2013 10:56</dtCadastro>
//<dtUltimaAtualizacao>03/04/2013 14:15</dtUltimaAtualizacao>
//</detalhes>
Local xRetorno

   ::oNode := ::oXML_Segmento[nContador-1]:getElementsByTagName( "detalhes" )

   aAdd( ::aResult, { ::PegaTag( "nomeSegmento" ), "NCM: " + ::PegaTag("ncm") } )

return .T.
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Saida(nContador) CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************

//local



return .T.
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Entrada(nContador) CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************

//local



return .T.
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Federal(nContador) CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************

//local



return .T.
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Excecoes() CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************

//local



return
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_ExcecaoEstado() CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************

//local



return
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Tratar_Importados() CLASS TComunicaXML
****************************************************************************
*
* Tratar os detalhes
* Parametros:
* Retorno:
*
* Autor: Samir
* 11/05/2015 - 08:53:45
*
****************************************************************************

//local



return
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD VerificaTag(cTag) CLASS TComunicaXML
****************************************************************************
*
* Verifica a existência de uma tag no retorno
* Parametros: cTag
* Retorno: lExiste
*
* Autor: Samir
* 14/05/2015 - 10:11:35
*
****************************************************************************

local lExiste := .F.

   if upper( "<"+cTag+">" )   $ upper( ::cRetorno ) .And.;
      upper( "</"+cTag+">" )  $ upper( ::cRetorno )

      lExiste := .T.

   end

return lExiste
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD PegaTag(cTag) CLASS TComunicaXML
****************************************************************************
*
* Obter o conteudo da tag no node
* Parametros: oNode
* Retorno: cResult
*
* Autor: Samir
* 14/05/2015 - 10:55:28
*
****************************************************************************

local cResult := Replicate("#!",10)

   Try
   
      cResult := ::oNode[0]:getElementsByTagName( cTag ):Item(0):Text
      
   Catch
   
      cResult := Replicate("#!",10)
   
   End
   
   If ( cResult = Replicate("#!",10) )
   
      MsgInfo("Erro ao pegar informação da TAG: " + cTag, "Erro!")
      
   End

return cResult
/*------------------------------------------------------------------------*/

****************************************************************************
procedure TestaWebservice()
****************************************************************************
*
*
* Parametros:
* Retorno: Nenhum
*
* Autor: Samir
* 07/05/2015 - 15:15:23
*
****************************************************************************

local oAF, cEan := Space(15)

   oAF := TComunicaXML():New()

   oAf:Comunicar()

   oAf:End()

Return Nil

/*------------------------------------------------------------------------*/

O esqueleto da classe está assim, tratando por nódulos, peguei como exemplo para implementar as modificações daqui:

http://www.w3schools.com/xml/xml_applications.asp

Link to comment
Share on other sites

Como fazer para tratar esse caso:



<importados>
<aliquotaInterestadual>4.00</aliquotaInterestadual>
<prefixo num="1">Estrangeira - Importação direta, exceto a indicada no código 6</prefixo>
<prefixo num="2">Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7</prefixo>
<prefixo num="6">Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX (vide Resolução Camex 79/2012)</prefixo>
<prefixo num="7">Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX (vide Resolução Camex 79/2012)</prefixo>
</importados>
As tags são numeradas e não são fechadas com a mesma nomenclatura
Link to comment
Share on other sites

Tente com o comando: HB_ATokens()



// EXEMPLO ENVIADO POR Arthur Silvestre em: 03/10/2013, Show()
// vXML := cGetFile( "*.xml", "Selecione o xml" )
// AQUI PEGA O TEXTO DO *.XML
vXML := cXmlCarta

oText = TTxtFile():New( vXML ) // Read Mode

oText:nMaxLineLength := 5120

TempText = oText:ReadLine()

TempText := StrTran( TempText, '/' )

aText := HB_ATokens( TempText, '<xCorrecao>' )

WTEXTO := aText[2]

// AQUI PEGA A DATA DA CARTA DE CORRECAO DO .XML
vXmlDT := cXmlCarta

oTextDt = TTxtFile():New( vXmlDT ) // Read Mode

oTextDt:nMaxLineLength := 5120

TempTextDT = oTextDt:ReadLine()

TempTextDT := StrTran( TempTextDT, '/' )

//<dhEvento>2013-10-04T09:58:50-03:00</dhEvento>
// DATA DO EVENTO
aDataEv := HB_ATokens( TempTextDT, '<dhEvento>' )


Abs

Link to comment
Share on other sites

Tente com o comando: HB_ATokens()
      // EXEMPLO ENVIADO POR Arthur Silvestre em: 03/10/2013, Show()
      // vXML := cGetFile( "*.xml", "Selecione o xml" )
      // AQUI PEGA O TEXTO DO *.XML
      vXML := cXmlCarta
 
      oText = TTxtFile():New( vXML ) // Read Mode
 
      oText:nMaxLineLength := 5120
 
      TempText = oText:ReadLine()
 
      TempText := StrTran( TempText, '/' )
 
      aText := HB_ATokens( TempText, '<xCorrecao>' )
 
      WTEXTO := aText[2]
 
      // AQUI PEGA A DATA DA CARTA DE CORRECAO DO .XML
      vXmlDT := cXmlCarta
 
      oTextDt = TTxtFile():New( vXmlDT ) // Read Mode
 
      oTextDt:nMaxLineLength := 5120
 
      TempTextDT = oTextDt:ReadLine()
 
      TempTextDT := StrTran( TempTextDT, '/' )
 
      //<dhEvento>2013-10-04T09:58:50-03:00</dhEvento>
      // DATA DO EVENTO
      aDataEv := HB_ATokens( TempTextDT, '<dhEvento>' )
Abs

Tratar como texto eu já imagino uma solução, mas queria uma solução similar a que já está implementada, caso não exista outra forma eu vou partir para o tratamento do texto, mas queria algo mais sofisticado e simples de implementar.

Link to comment
Share on other sites

  • 2 weeks later...

Olá galera.

Fiz esta pra capturar dados de xml de nfs-e.

Vejam ai

cARQXML := cPATHNFSE + "\NFSe\Autorizado\NFSe" + STRZERO(NUMRPS,8)+".Xml"
cTEXTXML:= MEMOREAD(cARQXML)
? CaptXml( "<ns4:DataEmissao>" )
? CaptXml("<ns4:RazaoSocial>")
? CaptXml("<ns4:ValorServicos>","N",2)
STATIC FUNCTION CaptXml( cSTRLOCAL,nTIPODADO,nDESCIMAIS)
LOCAL nPOSI,cSTRRET := " "
DEFAULT nTIPODADO := "C"
DEFAULT nDESCIMAIS := 0
nPOSI := AT(cSTRLOCAL,cTEXTXML)
IF nPOSI = 0
RETURN(" ")
ENDIF
nPOSI += LEN(cSTRLOCAL)
FOR i := nPOSI TO LEN(cTEXTXML)
cCHR := SUBSTR(cTEXTXML,i,1)
IF cCHR == "<"
EXIT
ENDIF
IF !EMPTY(cSTRRET)
cSTRRET += cCHR
ELSE
cSTRRET := cCHR
ENDIF
NEXT
IF nTIPODADO == "C" .OR. nTIPODADO == "D"
RETURN( cSTRRET )
ELSE // nTIPODADO == "N"
VARAUX1 := VAL(cSTRRET)
RETURN( STR(VARAUX1,10,nDESCIMAIS) )
ENDIF
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...