sambomb Posted May 8, 2015 Report Share Posted May 8, 2015 Alguém conhece alguma classe que retorne os dados do XML em um array ou Hash? Quote Link to comment Share on other sites More sharing options...
miragerr Posted May 8, 2015 Report Share Posted May 8, 2015 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. Quote Link to comment Share on other sites More sharing options...
rochinha Posted May 9, 2015 Report Share Posted May 9, 2015 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. Ariston Santos 1 Quote Link to comment Share on other sites More sharing options...
rochinha Posted May 11, 2015 Report Share Posted May 11, 2015 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. Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 11, 2015 Author Report Share Posted May 11, 2015 <?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> ... Quote Link to comment Share on other sites More sharing options...
rochinha Posted May 12, 2015 Report Share Posted May 12, 2015 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 sambomb 1 Quote Link to comment Share on other sites More sharing options...
rochinha Posted May 12, 2015 Report Share Posted May 12, 2015 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. ) sambomb 1 Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 12, 2015 Author Report Share Posted May 12, 2015 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! Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 14, 2015 Author Report Share Posted May 14, 2015 /*************************************************************************** * 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 Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 14, 2015 Author Report Share Posted May 14, 2015 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 Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 19, 2015 Author Report Share Posted May 19, 2015 Alguém sabe como tratar essas tags? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 19, 2015 Report Share Posted May 19, 2015 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 Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 19, 2015 Author Report Share Posted May 19, 2015 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. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted May 30, 2015 Report Share Posted May 30, 2015 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 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.