Jump to content
Fivewin Brasil

pegar dados de uma parte do xml


zekasan

Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
***************************************************************************
 


 

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...