zekasan Posted June 5, 2017 Report Share Posted June 5, 2017 Boa tarde, tentei um monte de coisa, porém de xml sou crú, preciso de ajuda para pegar informações de um determinado bloco de um xml: ... -<imp> -<ICMS> -<ICMS00> <CST>00</CST> <vBC>50.74</vBC> <pICMS>12.00</pICMS> <vICMS>6.09</vICMS> </ICMS00> </ICMS> <vTotTrib>7.72</vTotTrib> </imp> ... Preciso pegar os valores de vBC, pICMS,vICMS do bloco <imp>, porém há mais blocos que possuem o vBC e cICMS. e tem xml que só possue um valor cd vBC e vICMS. Alguém pode me ajudar?? GRATO teste.xml 35170660157377000180570010005583541105583542-procCTe.xml Quote Link to comment Share on other sites More sharing options...
sistem Posted June 5, 2017 Report Share Posted June 5, 2017 veja: xmlDoc := TXmlDocument():New( cFile ) If xmlDoc:nStatus != HBXML_STATUS_OK Msginfo("Erro ao ler XML", "Aviso!") Return nil Endif xmlIter := TXmlIterator():New( xmlDoc:oRoot ) xmlNode := xmlIter:Find() Do While xmlNode != nil If !Empty(xmlNode:cData) ... .. . if Lower(xmlNode:cName) == "qcom" nQuantidade := Val(xmlNode:cData) Elseif Lower(xmlNode:cName) == "xprod" cNomeProduto := Upper(xmlNode:cData) Elseif Lower(xmlNode:cName) == "vbc" nBaseValor := Val(xmlNode:cData) Elseif Lower(xmlNode:cName) == "picms" nPerIcms := Val(xmlNode:cData) nBaseValorIcms := nBaseValor Elseif Lower(xmlNode:cName) == "vicms" Nfei->Vic_Nfei := Val(xmlNode:cData) Elseif Lower(xmlNode:cName) == "picmsst" nPerIcmsST := Val(xmlNode:cData) nBaseValorIcmsST := nBaseValor ... .. . Endif Endif xmlNode := xmlIter:Next() Enddo no exemplo nBaseValor recebe o primeiro valor da TAG vbc...(que nao saberemos que base eh esta) caso encontrar a tag picms ... dai eh pôr o valor da variavel nBaseValorIcms := nBaseValor.. pois com certeza o ultimo valor da TAG vbc sera do ICMS. veja o exemplo que explica melhor. Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted June 5, 2017 Report Share Posted June 5, 2017 Veja essas minhas funções que capturam blocos ou somente uma string do xml: #INCLUDE "FiveWin.ch" #define PAD_LEFT 0 #define PAD_RIGHT 1 #define PAD_CENTER 2 FUNCTION ImprimeXmlDanfe() cARQXML := " " cARQXML := cGetFile( "*.XML", "Selecione o arquivo" ) IF EMPTY(cARQXML) RETURN Nil ENDIF cTEXTXML:= MEMOREAD(cARQXML) PRINT oPrn NAME "Imprime Espelho da NF-e " PREVIEW MODAL oPrn:SetPage(9) // 1=Carta 9=A4 oPrn:SetLandscape() // Paisagem DEFINE FONT oFont NAME "ARIAL" SIZE 27,10 OF OPRN DEFINE FONT oFont12N NAME "ARIAL" SIZE 36,12 BOLD OF OPRN DEFINE FONT oFont10N NAME "ARIAL" SIZE 27,10 BOLD OF OPRN DEFINE FONT oFont10 NAME "ARIAL" SIZE 27,10 OF OPRN DEFINE PEN oPen WIDTH 2 OF oPrn Define Pen oPen1 style PS_DOT Width 1 Color CLR_HGRAY Of oPrn ResLinha := oPrn:nLogPixely()/2.54 ResColuna := oPrn:nLogPixelx()/2.54 oPrn:SetFont(oFont10N) nCOLE := 6 nITEM := 0 lEND := .F. WHILE !lEND PAGE nPROW := 0 // En MyBox(1.00,1.00,02.7,28) oPrn:CmSay(1.5,1.3,VEMPRES,oFont12N) oPrn:CmSay(1.5,14,"Data Impressão "+NOVADATA(DATE())) VARAUX1 := CaptBlocoXml( "<ide>","</ide>") oPrn:CmSay(2.0,1.3,"Espelho NF-e " +CaptBlocoStr("<cNF>","</cNF>")) oPrn:CmSay(2.0,14,"Emissão: " +CaptBlocoStr("<dhEmi>","</dhEmi>")) // MyBox(2.70,1.00,04.7,28) VARAUX1 := CaptBlocoXml( "<emit>","</emit>") oPrn:CmSay(3.0,1.3,"Emitente "+CaptBlocoStr("<xNome>","</xNome>")) oPrn:CmSay(3.5,1.3,"Endereço "+CaptBlocoStr("<xLgr>","</xLgr>")+" - "+; CaptBlocoStr("<nro>","</nro>") ) oPrn:CmSay(4.0,1.3,"Bairro "+CaptBlocoStr("<xBairro>","</xBairro>")+" - "+; CaptBlocoStr("<xMun>","</xMun>")+" - "+; CaptBlocoStr("<UF>","</UF>") ) // // Itens // nPROW := 04.5 MyBox(nPROW,01.00,nPROW+0.6,03.00," Quant",oFont10N,PAD_RIGHT) MyBox(nPROW,03.00,nPROW+0.6,04.00,"Unid",oFont10N,PAD_LEFT) MyBox(nPROW,04.00,nPROW+0.6,11.50,"Descrição dos Produtos",oFont10N,PAD_LEFT) MyBox(nPROW,11.50,nPROW+0.6,14.00,"Código",oFont10N,PAD_LEFT) MyBox(nPROW,14.00,nPROW+0.6,16.00,"Preço Unit",oFont10N,PAD_RIGHT) MyBox(nPROW,16.00,nPROW+0.6,18.00," Total Item",oFont10N,PAD_RIGHT) MyBox(nPROW,18.00,nPROW+0.6,19.00,"CST",oFont10N,PAD_RIGHT) MyBox(nPROW,19.00,nPROW+0.6,20.50,"Ncm",oFont10N,PAD_RIGHT) MyBox(nPROW,20.50,nPROW+0.6,21.50,"Icms",oFont10N,PAD_RIGHT) MyBox(nPROW,21.50,nPROW+0.6,23.00,"Red Icm",oFont10N,PAD_RIGHT) MyBox(nPROW,23.00,nPROW+0.6,24.50,"Alq Pis",oFont10N,PAD_RIGHT) MyBox(nPROW,24.50,nPROW+0.6,28.00,"Alq Cofins",oFont10N,PAD_RIGHT) // nPROW += 0.6 MyBox(nPROW,1.00,20.0,28) nPROW += 0.2 nITEMPAG := 0 WHILE !lEND .AND. nITEMPAG < 29 // <det nItem="1"> ++ nITEM ++ nITEMPAG cITEMI := '<det nItem="' + LTRIM(STR(nITEM,3)) + '">' cITEMF := '<det nItem="' + LTRIM(STR(nITEM+1,3)) + '">' IF AT(cITEMF,cTEXTXML) = 0 // <transp> cITEMF := "<transp>" lEND := .T. ENDIF VARAUX1 := CaptBlocoXml( cITEMI,cITEMF) oPrn:CmSay(nPROW,02.8,CaptBlocoStr("<qTrib>","</qTrib>"),oFont,,,,PAD_RIGHT) oPrn:CmSay(nPROW,03.2,CaptBlocoStr("<uCom>","</uCom>"),oFont ) oPrn:CmSay(nPROW,04.1,CaptBlocoStr("<xProd>","</xProd>"),oFont) oPrn:CmSay(nPROW,11.55,CaptBlocoStr("<cProd>","</cProd>",9),oFont ) oPrn:CmSay(nPROW,15.98,CaptBlocoStr("<vUnCom>","</vUnCom>"),oFont,,,,PAD_RIGHT ) oPrn:CmSay(nPROW,17.98, CaptBlocoStr("<vProd>","</vProd>"),oFont,,,,PAD_RIGHT ) oPrn:CmSay(nPROW,18.96, CaptBlocoStr("<CST>","</CST>"),oFont,,,,PAD_RIGHT ) oPrn:CmSay(nPROW,19.07, CaptBlocoStr("<NCM>","</NCM>"),oFont ) oPrn:CmSay(nPROW,20.56, CaptBlocoStr("<pICMS>","</pICMS>"),oFont ) oPrn:CmSay(nPROW,22.97, CaptBlocoStr("<pRedBC>","</pRedBC>"),oFont,,,,PAD_RIGHT ) oPrn:CmSay(nPROW,24.47, CaptBlocoStr("<pPIS>","</pPIS>"),oFont,,,,PAD_RIGHT ) oPrn:CmSay(nPROW,27.40, CaptBlocoStr("<pCOFINS>","</pCOFINS>"),,,,PAD_RIGHT ) nPROW += 0.5 IF !lEND LH(nPROW-0.1,1.1,27.9,12,oPen1) ENDIF ENDDO ENDPAGE ENDDO ENDPRINT RETURN Nil ***************************************************************************** FUNCTION CaptBlocoXml(cBEGINBL,cENDBL) LOCAL nLENST LOCAL nPOSII := AT(cBEGINBL,cTEXTXML) LOCAL nPOSIF := AT(cENDBL,cTEXTXML) IF nPOSII = 0 .OR. nPOSIF = 0 RETURN(" ") ENDIF nLENST := nPOSIF+1 - nPOSII RETURN( SUBSTR(cTEXTXML,nPOSII,nLENST) ) ***************************************************************************** FUNCTION CaptBlocoStr(cBEGINBL,cENDBL,lLENMAX) LOCAL nLENST LOCAL nPOSII := AT(cBEGINBL,VARAUX1) LOCAL nPOSIF := AT(cENDBL,VARAUX1) IF nPOSII = 0 .OR. nPOSIF = 0 RETURN(" ") ENDIF nPOSII += LEN(cBEGINBL) // Exemplo: <xNome>DEFAL COMERCIO ATACADISTA DE BEBIDAS E ALIMENTOS LTDA</xNome> nLENST := nPOSIF - nPOSII IF !lLENMAX == Nil .AND. nLENST > lLENMAX nLENST := lLENMAX ENDIF RETURN( SUBSTR(VARAUX1,nPOSII,nLENST) ) ***************************************************************************** FUNCTION MyBox(nLinI,nColI,nLinF,nColF,cTITULO,oFONT,PADSEL,cCONTEUDO) // 1º 2º 3º 4º 5º 6º 7º 8º // // Oitavo parâmetro de mybox escrito em 15/06/2011 na techlix as 10:23 // LOCAL nCOL := nColI,nPROWI := nLinI DEFAULT PADSEL := 0 IF PADSEL = 1 // PAD_RIGHT nCOL := nColF - 0.1 ELSE nCOL := nColI + 0.1 ENDIF IF nLinF > 0.00 oPrn:Cmtr2Pix(@nLinI, @nColI) oPrn:cmtr2Pix(@nLinF, @nColF) oPrn:Box(nLinI, nColI, nLinF, nColF, oPen ) ENDIF IF cTITULO # Nil IF VALTYPE(cTITULO) == "C" oPrn:CmSay(nPROWI+0.1,nCOL,cTITULO,oFONT,,,,PADSEL) ELSE // Array oPrn:CmSay(nPROWI-0.1,nCOL,cTITULO[1],oFONT,,,,PADSEL) oPrn:CmSay(nPROWI+0.1,nCOL,cTITULO[2],oFONT,,,,PADSEL) ENDIF ENDIF IF cCONTEUDO # Nil oPrn:CmSay(nPROW+0.5,nCOL,cCONTEUDO,oFONT,,,,PADSEL) ENDIF RETURN Nil *************************************************************************** FUNCTION Lh(nLinI,nColI,nColF,LenFnt,oPensel) // Logica Quanto maior o divisor menor é a linha LOCAL nLinF DEFAULT LenFnt := 10 IF LenFnt = 12 nLinI := nLinI // / 2.355 // VARAUX2 // em PDF muda. Verificar ELSEIF LenFnt = 10 nLinI := nLinI / 2.820 // VARAUX2 // em PDF muda. Verificar ELSE nLinI := nLinI / 2.815 // em PDF muda. Verificar ENDIF nLinF := nLinI + 0.01 oPrn:Cmtr2Pix(@nLinI, @nColI) oPrn:cmtr2Pix(@nLinF, @nColF) oPrn:Box(nLinI, nColI, nLinF, nColF, IF( oPensel == Nil,oPen,oPensel) ) RETURN Nil *************************************************************************** Quote Link to comment Share on other sites More sharing options...
zekasan Posted June 6, 2017 Author Report Share Posted June 6, 2017 Agradeço muito a ajuda, Deus os abençõem Quote Link to comment Share on other sites More sharing options...
zekasan Posted June 6, 2017 Author Report Share Posted June 6, 2017 SISTEM caiu como uma luva prá mim, ótimo exemplo prá começar a tratar o xml, muito obrigado tb JFAGUIAR Quote Link to comment Share on other sites More sharing options...
sistem Posted June 6, 2017 Report Share Posted June 6, 2017 dnada amigo zekasan 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.