Página 2 de 2

Ler XML de notas de entradas

Enviado: 20 Mar 2015 13:41
por Itamar M. Lins Jr.
Ô sujeito!!!
Estude o código.
Tem um DO WHILE!!!
append que é a função incluir() ...

Eu já fiz aqui e está funcionando.

As TAGS não são unicas p/ quase nada todas tem um tanto de repetição, não apenas p/ <pCOFINS> mas / valores, descontos, etc...
Não é para pegar a TAG única porque não existe ela nos produtos. Só no final tem ela no campo TOTAIS.

É a mesma coisa que indexar por ordem de produtos! NODE(<det>)

Código: Selecionar todos

     oDet := oXML:findfirst( "det" ) //pare na primeira incidência! Tags <cProd> ... <pCONFINS> ... etc... são várias!!!
Achar o cabeçalho(node) com os totais da NFe

Código: Selecionar todos

      oTotal := oXML:findfirst( "total" ) //Pare no campo totais //Pegar total base calculo, Frete, COFINS, IPI, etc ... Aqui é o total de cada campo.
Código atualizado. Quem usa Hwgui copiar e colar! (basta trocar os nomes no DBF) é fácil entender.

Código: Selecionar todos

***********************
Function LerDANFE(oDlg)
***********************
*
*
LOCAL cStr, oNFe, cDirXML, cArq, oDlgDanfe, cTitulo := "Importar NFe", lOk := .F., lDuplicatas:=.T.
LOCAL cUF:="", dEmi:=CToD(""), dSaiEnt := CToD(""), cEAN
PREPARE FONT oFont NAME "Verdana" WIDTH 0 HEIGHT -18

INIT DIALOG oDlgDanfe CLIPPER TITLE cTitulo Font oFont AT 0,0 SIZE 380,150 STYLE DS_CENTER + WS_SYSMENU ;
On Exit {||.t. }

dRecebido := date()

@ 005,035 Say "Recebimento:" size 130,20
@ 140,030 get oRecebido Var dRecebido size 100,30

@ 005,090 get CheckBox lDuplicatas  Caption  'Lançar duplicatas.' size 250,20

@ 270,020 Button oBt Caption 'Cancelar'   Size 100,30  ON CLICK {||hwg_EndDialog()}
@ 270,070 Button oBt Caption 'Confirmar'  Size 100,30  ON CLICK {||lOk:=.t.,hwg_EndDialog()}

oDlgDanfe:Activate()

IF !lOk
   Return .t.
ENDIF

If en->(dbseek('DIR'+'DANFE'))
   cDirDanfe := alltrim(en->dados)
Else
   cDirDanfe := 'c:\master\danfe\'
EndIf

   cArq := HWG_SelectFile( "Arquivos XML ( *.xml )", "*.xml", cDirDanfe )

   cStr := hb_MemoRead( cArq )

   DirChange( cPasta )

   IF Empty( cStr )
      hwg_Msginfo("Não achou o arquivo XML")
      RETURN
   ENDIF

   oXML := TXMLDocument():New( cStr, HBXML_STYLE_NOESCAPE )
   IF oXML:nError != HBXML_ERROR_NONE
      hwg_Msgstop( "xml com problema " + Str( oXML:nError ) )
      RETURN
   ENDIF

   oNFe := oXML:findfirst( "infNFe" )
   IF oNFe == NIL
      hwg_Msgstop( "TAG infNFe não localizada." )
      RETURN
   ENDIF

      oIde := oXML:findfirst( "ide" )
      IF oIde == NIL
         hwg_Msgstop( "TAG ide não localizada." )
         RETURN
      ENDIF

      oIterator := TXmlIterator():New( oIde )

      DO WHILE .T.

         oCurrent := oIterator:Next()
         IF oCurrent == NIL
            //hwg_Msginfo("Fim da Leitura da oIDE ")
            Exit
         ELSE
            //hwg_Msginfo("Tag Atual: " + oCurrent:cName) //? "current tag : " + oCurrent:cName
            IF oCurrent:cName == "cUF"
               cUF := oCurrent:cData
            ELSEIF oCurrent:cName == "nNF"
               cNF := oCurrent:cData
            ELSEIF oCurrent:cName == "serie"
               cSerie := oCurrent:cData
            ELSEIF oCurrent:cName $ "dEmi dhEmi"
               dEmi := hb_stod( strtran(oCurrent:cData,"-","") )
            //ELSEIF oCurrent:cName == "dSaiEnt"
            //   dSaiEnt := hb_stod( strtran(oCurrent:cData,"-","") )
            ENDIF
         ENDIF

      ENDDO

      If Empty(cNF)
          hwg_Msgstop("DANFE com problema."+hb_eol()+"Número da NFe, não informado.")
          Return
      EndIf
      If Empty(dEmi)
          hwg_Msgstop("DANFE com problema."+hb_eol()+"DATA da emissão, não informada.")
          Return
      EndIf

      oEmit := oXML:findfirst( "emit" )
      IF oEmit == NIL
         hwg_Msgstop( "TAG emit não localizada." )
         RETURN
      ENDIF

      oIterator := TXmlIterator():New( oEmit )
      cCNPJ   := ""
      cFone   := ""      
      dSaiEnt := date()

      DO WHILE .T.

         oCurrent := oIterator:Next()
         IF oCurrent == NIL
            //hwg_Msginfo("Fim da Leitura da oEmit ")
            EXIT
         ELSE
            //hwg_Msginfo("Tag Atual: " + oCurrent:cName) //? "current tag : " + oCurrent:cName
            IF oCurrent:cName == "CNPJ"
               cCNPJ := oCurrent:cData
            ELSEIF oCurrent:cName == "xNome"
               cNome := oCurrent:cData
            ELSEIF oCurrent:cName == "xLgr"
               xLgr := oCurrent:cData
            ELSEIF oCurrent:cName == "nro"
               cNRO := oCurrent:cData
            ELSEIF oCurrent:cName == "xBairro"
               xBairro := oCurrent:cData
            ELSEIF oCurrent:cName == "xMun"
               xMun := oCurrent:cData
            ELSEIF oCurrent:cName == "UF"
               cUF := oCurrent:cData
            ELSEIF oCurrent:cName == "CEP"
               cCEP := oCurrent:cData
            ELSEIF oCurrent:cName == "fone"
               cFone := oCurrent:cData
            ELSEIF oCurrent:cName == "IE"
               cIE := oCurrent:cData
            ENDIF
         ENDIF

      ENDDO
      
      fo->(OrdSetFocus(3)) //CNPJ      
      If fo->(DbSeek(cCNPJ))
         cCodFor := fo->cod_fornec
         er->(ordSetFocus(1))
         IF er->( dbSeek(strzero(val(cNF),9)+cCodFor+dtos(dRecebido)) )
            hwg_MsgStop("NFe já cadastrada !")
            RETURN .F.
         ENDIF
      ELSE
         cCodFor := ""
      ENDIF
      
      er->(ordSetFocus(6)) //dtos(es_datarec)
        
      If empty(cCNPJ)
         cCNPJ := "SEM CNPJ"
      EndIf
      //Novo fornecedor
      If Empty(cCodFor)
          fo->(OrdSetFocus(1))
          fo->(DbGoBottom()) 
          nPos   := hb_At( SubStr(fo->cod_fornec,1,1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ" )
          cLetra := SubStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",nPos+1,1)
          IF SubStr(fo->cod_fornec,2,3) == "999" 
             cCodFor := cLetra + "001"   
          Else
             cCodFor := cLetra + strzero(val(substr(fo->cod_fornec,2,3))+1,3)
          Endif
             
          incluir('fo')
          fo->cod_fornec := cCodFor
          fo->cgc        := cCNPJ
          fo->fornecedor := cNome
          fo->endereco   := alltrim(xLgr) + ", " + cNRO
          fo->bairro     := xBairro
          fo->cidade     := xMun
          fo->uf         := cUF
          fo->cep        := cCEP
          fo->telefone   := cFone
          fo->insc_estad := cIE
      EndIF

         Incluir('er')
         er->cod_fornec := cCodFor
         er->fornecedor := cNome
         er->cnpj       := cCNPJ
         er->cfop       := ""
         er->es_numero  := strzero(val(cNF),9)
         er->es_modelo  := 55
         er->es_serie   := cSerie
         er->es_subseri := ""
         er->es_dataemi := dEmi
         er->es_datarec := dRecebido //dSaiEnt
         er->es_situaca :=  "N"
         er->es_codfisc := "1"
         er->loja       := "001"
         er->es_emitent := "T"
         er->DifNF      := 0
         er->es_emitent := 'T'
         
      oDet := oXML:findfirst( "det" )
      IF oDet == NIL
         hwg_Msgstop( "TAG det não localizada." )
         RETURN
      ENDIF
      nItem := 0
      cd->(ordSetFocus(1))
      cd->(OrdScope(0,NIL))
      cd->(OrdScope(1,NIL))

      Do While .T.

         oIterator := TXmlIterator():New( oDet )
         nIPI := nPIS := nCOFINS := 0
         cEAN := ""
         DO WHILE .T.

            oCurrent := oIterator:Next()

            IF oCurrent == NIL
               EXIT
            ELSE

               IF oCurrent:cName == "cProd"
                  cProd := oCurrent:cData
               ELSEIF oCurrent:cName == "xProd"
                  xProd := AllTrim(charone(" ",oCurrent:cData))
               ELSEIF oCurrent:cName == "NCM"
                  cNCM := oCurrent:cData
               ELSEIF oCurrent:cName == "CFOP"
                  cCFOP := oCurrent:cData
               ELSEIF oCurrent:cName == "uCom"
                  uCom := oCurrent:cData
               ELSEIF oCurrent:cName == "qCom"
                  qCom := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vUnTrib"
                  nUnTrib := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "pIPI"
                  nIPI := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "pCOFINS"
                  nCOFINS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "pPIS"
                  nPIS := val(oCurrent:cData)                  
               ELSEIF oCurrent:cName == "vDesc"
                  nDesconto := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "cEAN"
                   IF hb_IsChar(oCurrent:cData)
                      cEAN := AllTrim(oCurrent:cData)
                   ENDIF
               ENDIF
            ENDIF

         ENDDO
         //Verifica se a mercadoria já foi comprada deste fornecedor
         cCodMerc := ""
         nMargem  := nImpFed :=0
         IF cd->(DbSeek(cCNPJ+cProd))
            IF !empty(cd->codigosis)
               cCodMerc := cd->codigosis
               If eq->(DbSeek(cCodMerc))
                  nMargem := eq->margem
                  nImpFed := eq->imposto
                  xProd   := eq->mercadoria
               EndIf
            ENDIF
            If Empty(cd->descricao)
               TravaRegistro('cd')
               cd->descricao := xProd
            EndIf
         ELSE
            incluir('cd')
            cd->cnpj      := cCNPJ
            cd->codigonfe := cProd
            cd->descricao := xProd
         ENDIF

         IF cCFOP == "5405"
            cCFOP := "1403"
         ELSEIF cCFOP == "6405"
            cCFOP := "2403"
         ELSEIF cCFOP == "5403"
            cCFOP := "1403"
         ELSEIF cCFOP == "6403"
            cCFOP := "2403"
         ELSEIF cCFOP == "5102"
            cCFOP := "1102"
         ELSEIF cCFOP == "6102"
            cCFOP := "2102"
         ELSEIF cCFOP == "5905"
            cCFOP := "1905"
         ELSEIF cCFOP == "6905"
            cCFOP := "2905"
         ELSEIF cCFOP == "5101"
            cCFOP := "1102"
         ELSEIF cCFOP == "6101"
            cCFOP := "2102"
         ENDIF

         nItem ++
         incluir('et')
         et->nf_entrada := strzero(val(cNF),9)
         et->cod_fornec := cCodFor
         et->data       := dRecebido //dSaiEnt
         et->cfop       := cCFOP
         et->cprod      := cProd
         et->cod_mercad := cCodMerc
         et->mercadoria := xProd
         et->quantidade := qCom
         et->item       := nItem
         et->valor_unit := nUnTrib
         et->ncm        := cNCM
         et->descfreace := nDesconto
         et->icms_credi := 0
         et->ipi        := nIPI
         et->pis        := nPIS
         et->cofins     := nCOFINS
         et->frete      := 0
         et->lucro      := nMargem
         et->gastos     := 0
         et->i_f        := nImpFed
         et->icms_debit := 0
         et->comissao   := 0
         et->local      := 0
         et->etiquetas  := qCom
         et->ean        := cEAN
         
         If !nc->(DbSeek(cNCM))
            incluir('nc')
            nc->cod_ncm := cNCM
         EndIf

         oDet := oXML:findnext( "det" )
         If oDet == NIL
            exit
         EndIf

      EndDo
      NetFlush('nc')
      NetFlush('et')
      NetFlush('cd')
      cd->(ordSetFocus(1))
      cd->(OrdScope(0,cCNPJ))
      cd->(OrdScope(1,cCNPJ))

      oTotal := oXML:findfirst( "total" )
      IF oTotal == NIL
         hwg_Msgstop( "TAG total não localizada." )
         RETURN
      ENDIF

        //Store 0.00 to nNF, nBC, nICMS, nST, nProd, nFrete, nSeg, nDesc, nIsento, nIPI, nOutro
        oIterator := TXmlIterator():New( oTotal )

        DO WHILE .T.

            oCurrent := oIterator:Next()

            IF oCurrent == NIL
               EXIT
            ELSE

               IF oCurrent:cName == "vBC"
                  nBC := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vICMS"
                  nICMS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vST"
                  nST := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vProd"
                  nProd := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vFrete"
                  nFrete := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vSeg"
                  nSeg := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vDesc"
                  nDesc := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vII"
                  nIsento := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vIPI"
                  nIPI := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vPIS"
                  nPIS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vCOFINS"
                  nCOFINS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vOutro"
                  nOutDespAce := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vNF"
                  nNF := val(oCurrent:cData)

               ENDIF
            ENDIF

         ENDDO
             //hwg_Msginfo(str(nOutDespAce))
              Travaregistro('er')
              er->es_valorto := nNF
              er->es_baseicm := nBC
              er->es_valicms := nICMS
              er->es_isenta  := nISento
              er->es_outras  := nST //nOutro
              er->desconto   := nDesc
              er->es_totprod := nProd
              er->es_frete   := nFrete
              er->es_ipi     := nIPI
              er->es_aliquot := 0 //nST
              er->outdespace := nOutDespAce
              er->cofins     := nCOFINS
              er->pis        := nPIS 
              NetFlush('er')

        //Contas a pagar 
        /*
        oFat := oXML:findfirst( "fat" )
        IF oFat == NIL
           hwg_Msgstop( "TAG fat não localizada." )
        Else
            oIterator := TXmlIterator():New( oFat )

            DO WHILE .T.

               oCurrent := oIterator:Next()
               IF oCurrent == NIL
                  EXIT
               Else
                  IF oCurrent:cName == "nFat"
                     cFat := val(oCurrent:cData)
                  EndIf
               EndIf

            ENDDO

        ENDIF
        */
   If lDuplicatas
      oDup := oXML:findfirst( "dup" )
      IF oDup == NIL
           hwg_Msgstop( "TAG dup não localizada." + hb_eol() + "Não houve lançamentos no contas a pagar." )
      Else
         Do While .t.

            oIterator := TXmlIterator():New( oDup )

               DO WHILE .T.

                  oCurrent := oIterator:Next()

                  IF oCurrent == NIL
                     EXIT
                  ELSE
                     IF oCurrent:cName == "nDup"
                        cDup := oCurrent:cData
                     ELSEIF oCurrent:cName == "dVenc"
                        dVenc := hb_stod( strtran(oCurrent:cData,"-","") )
                     ELSEIF oCurrent:cName == "vDup"
                        nDup := val(oCurrent:cData)
                     ENDIF

                  ENDIF
               EndDo

               incluir('pa')
               pa->nf_compra  := strzero(val(cNF),9)
               pa->cod_fornec := cCodFor
               pa->fornecedor := cNome
               pa->duplicata  := cDup
               pa->data_vcto  := dVenc
               pa->valor      := nDup
               pa->data_emis  := dEmi
               pa->loja       := "001"

               oDup := oXML:findnext( "dup" )
               If oDup == NIL
                  exit
               EndIf

         EndDo

         NetFlush('pa')

      EndIf
   EndIf

  oXML := NIL

et->(ordSetFocus(1))
et->(OrdScope(0,er->es_numero+er->cod_fornec+dtos(er->es_datarec) ))
et->(OrdScope(1,er->es_numero+er->cod_fornec+dtos(er->es_datarec) ))
et->(DbGoTop())

pa->(ordSetFocus(5))
pa->(OrdScope(0,er->cod_fornec) )
pa->(OrdScope(1,er->cod_fornec) )
pa->(DbGoBottom())

oDlg:oBrw:Refresh()
oDlg:oTab:oBrPd:Refresh()
oDlg:oTab:oBrwDP:Refresh()

IF hwg_MsgYesNo("DANFE Importado. Deseja Apagar o XML ?")
    FErase( cArq )
ENDIF
   
RETURN .t.


Saudações,
Itamar M. Lins Jr.

Ler XML de notas de entradas

Enviado: 20 Mar 2015 13:49
por jairfab
Janio, seguindo a logica basta acrescentar algo deste tipo:

Código: Selecionar todos

FUNCTION ITENS(oDoc)

LOCAL oNode, nPos, oIterator, oCurrent

oNode:= oDoc:FindFirst( "det" )

WHILE !( oNode == Nil )

   // Processa oNode (itens da nf) 
   oIterator := TXmlIterator():New( oNode )
   oCurrent:= oIterator:Next()
   WHILE !( oCurrent == Nil )
      
      IF oCurrent:cName == "prod"
         
         nDepth:= oIterator:getNode():depth()
         
         WHILE .t.
            oCurrent := oIterator:Next()
            IF oCurrent == Nil .or. oCurrent:depth() <= nDepth
               EXIT
            ENDIF  
            IF oCurrent:cName == "cProd"
               cProd:= oCurrent:cData
            ELSEIF oCurrent:cName == "cEAN"
               cEAN:= oCurrent:cData
            ELSEIF oCurrent:cName == "xProd"
               xProd:= oCurrent:cData
            ELSEIF oCurrent:cName == "NCM"
               NCM:= oCurrent:cData
            ENDIF
         ENDDO
         
      ELSEIF oCurrent:cName == "imposto"
      
         oCurrent:= oIterator:Next()
         WHILE !( oCurrent == Nil )
            
            IF oCurrent:cName == "ICMS"

                nDepth:= oIterator:getNode():depth()
                
                WHILE .t.
                   oCurrent := oIterator:Next()
                   IF oCurrent == Nil .or. oCurrent:depth() <= nDepth
                      EXIT
                   ENDIF  
                   IF oCurrent:cName == "orig"
                      ICMS_orig       := oCurrent:cData
                   ELSEIF oCurrent:cName == "CST"
                      ICMS_CST        := oCurrent:cData
                   ELSEIF oCurrent:cName == "vBC"
                      ICMS_vBC        := oCurrent:cData
                   ELSEIF oCurrent:cName == "pICMS"
                      ICMS_pICMS      := oCurrent:cData
                   ELSEIF oCurrent:cName == "vICMS"
                      ICMS_vICMS      := oCurrent:cData
                   ENDIF
                ENDDO


            ELSEIF oCurrent:cName == "PIS"

                nDepth:= oIterator:getNode():depth()
                
                WHILE .t.
                   oCurrent := oIterator:Next()
                   IF oCurrent == Nil .or. oCurrent:depth() <= nDepth
                      EXIT
                   ENDIF  
                   IF oCurrent:cName == "CST"      
                      PIS_CST      := oCurrent:cData
                   ELSEIF oCurrent:cName == "vBC"      
                      PIS_vBC      := oCurrent:cData          
                   ELSEIF oCurrent:cName == "pPIS"     
                      PIS_pPIS     := oCurrent:cData          
                   ELSEIF oCurrent:cName == "vPIS"     
                      PIS_vPIS     := oCurrent:cData          
                   ELSEIF oCurrent:cName == "qBCProd"  
                      PIS_qBCProd  := oCurrent:cData          
                   ELSEIF oCurrent:cName == "vAliqProd"
                      PIS_vAliqProd:= oCurrent:cData
                   ENDIF
                
                ENDDO
            ELSE
               oCurrent:= oIterator:Next()
            ENDIF
            
         ENDDO
      
      ELSE
         oCurrent:= oIterator:Next()
      ENDIF
   
   ENDDO

   oNode:= oDoc:FindNext()

ENDDO


RETURN NIL 


Ler XML de notas de entradas

Enviado: 20 Mar 2015 15:07
por janio
Itamar,

Vc acha q eu vou reinventar a roda? Perder horas, horas e horas estudando um fonte q outra pessoa (vc) já o fez e minha duvida era mínima?

Deve ser pra isso que existe forum...

Alias, essa classe eh complicadíssima de se entender! O único exemplo 'usual' que vi até agora foi esse seu. Mas eh como vc disse... foram dias e dias estudando para começar a entender o seu funcionamento!

Eu apenas apresentei uma duvida... vc apresentou uma 'solução' e eu disse q a solução q vc havia apresentando num estava funcionando. Porém, todavia, no entanto... eu falei q ia mim virar num foi?

Janio

Ler XML de notas de entradas

Enviado: 20 Mar 2015 17:39
por Itamar M. Lins Jr.
Pois é!
O código está ai e está funcionando.
Já arrumei(adicionei) o que vc pediu é só usar.
Não tem esse erro apontado por vc no código.

Saudações,
Itamar M. Lins Jr.

Ler XML de notas de entradas

Enviado: 20 Mar 2015 17:45
por Itamar M. Lins Jr.
Perder horas, horas e horas estudando um fonte q outra pessoa (vc) já o
Estudo nunca é de mais. Vc irá entender o funcionamento de uma classe bem interessante. Pois com ela vc irá fazer quase tudo com intercambio de informações.
Ainda mais p/ vc que usa MySQL copiar, importar, exportar dados, para qualquer BD.

Lógico que tem seu gosto, mas é assim que funciona p/ as demais linguagens também.
Hoje XML com a internet(troca de informações) tem muita coisa, não só NFe.

Saudações,
Itamar M. Lins Jr.

Ler XML de notas de entradas

Enviado: 20 Mar 2015 17:52
por Itamar M. Lins Jr.
O único exemplo 'usual' que vi até agora foi esse seu.
Usando o duckduckgo.com (concorrente do google) p/ pesquisar.
Já usando TIPClientHTTP() classe similar.
Tem outros exemplos no Harbour p/ XML usando a mesma classe que usei, alias aprendi(um pouco) estudando os exemplos.

Código: Selecionar todos


/* Makes an Internet search and displays the links from the response HTML page */

#require "hbssl"
#require "hbtip"

#if ! defined( __HBSCRIPT__HBSHELL )
REQUEST __HBEXTERN__HBSSL__
#endif

PROCEDURE Main()

   LOCAL cURL := iif( tip_SSL(), "https://", "http://" ) + "duckduckgo.com/html/"
   LOCAL oHTTP := TIPClientHTTP():New( cURL )
   LOCAL cHtml, oNode, oDoc

   ? "URL:", cURL

   /* build the search query and add it to the TUrl object */
   oHTTP:oURL:addGetForm( { ;
      "q"  => "Harbour+Project", ;
      "kl" => "us-en" } )

   /* Connect to the HTTP server */
   IF ! oHTTP:Open()
      ? "Connection error:", oHTTP:lastErrorMessage()
      RETURN
   ENDIF

   /* download the response */
   cHtml := oHTTP:ReadAll()
   oHTTP:Close()
   ? hb_ntos( Len( cHtml ) ), "bytes received"
   ?

   oDoc := THtmlDocument():New( cHtml )

   oDoc:writeFile( "result.htm" )

   /* "aS" is the plural of "a" and returns all <a href="url"> tags */
   FOR EACH oNode IN oDoc:body:div( "links" ):aS
      IF oNode:class == "large"
         ? tip_HtmlToStr( oNode:getText( "" ) ), oNode:href
      ENDIF
   NEXT

   RETURN
Saudações,
Itamar M. Lins Jr.

Ler XML de notas de entradas

Enviado: 20 Mar 2015 20:35
por janio
Jairfab,

Funcionou direitinho! Assim foi mamão com açúcar!
:{ :xau

Itamar,

Usava o acbr para ler os xml's. Agora estou sem esta pendência de programa externo!

Vlw

Janio

Ler XML de notas de entradas

Enviado: 20 Mar 2015 20:58
por Itamar M. Lins Jr.
Ola!
Da forma que o Jairfab explicou é mais complicado(nem tanto) porque entra nos sub níveis do XML.
No exemplo que postei eu uso apenas o nível superior e com "DO WHILE e NEXT" vou pegando os dados.
Esse:
oDet := oXML:findfirst( "det" ) é o nivel primeiro

E aqui eu pego o que desejar

Código: Selecionar todos

      oDet := oXML:findfirst( "det" )
      IF oDet == NIL
         hwg_Msgstop( "TAG det não localizada." )
         RETURN
      ENDIF

      Do While .T.

         oIterator := TXmlIterator():New( oDet )
         nIPI := nPIS := nCOFINS := 0
         cEAN := ""
         DO WHILE .T.

            oCurrent := oIterator:Next()

            IF oCurrent == NIL
               EXIT
            ELSE

               IF oCurrent:cName == "cProd"
                  cProd := oCurrent:cData
               ELSEIF oCurrent:cName == "xProd"
                  xProd := AllTrim(charone(" ",oCurrent:cData))
...
Um nível só.

Saudações,
Itamar M. Lins Jr.

Ler XML de notas de entradas

Enviado: 20 Mar 2015 21:38
por Itamar M. Lins Jr.
Porém meu objetivo é usar a classe HBNFe, mas parece que está abandonada no SVN, tem até dois SVN´s.
O José Quintas começou e não terminou.
Não será melhor o José Quintas começar um novo SVN só com a classe dele ?

Saudações,
Itamar M. Lins Jr.

Ler XML de notas de entradas

Enviado: 17 Mai 2016 17:32
por marcos.gurupi
Colegas, quando ocorre um erro ao ler o xml com o codigo 11, o q se refere ?

Segue abaixo o codigo:

Código: Selecionar todos

cStr := MemoRead( cArq )
oXML := TXMLDocument():New( cStr, HBXML_STYLE_NOESCAPE ) 
IF oXML:nError != HBXML_ERROR_NONE 
    Msgstop( "xml com problema " + Str( oXML:nError ) ) // Aqui esta aparecendo codigo 11
   RETURN 
ENDIF 

Ler XML de notas de entradas

Enviado: 29 Jul 2016 11:24
por JoséQuintas
Não sei se resolveram.
Vejam se usando XmlNode() fica mais fácil de entender.
Se servir a rotina pronta com as informações que uso, então estará tudo pronto.

https://pctoledo.org/forum/viewto ... 54&t=17413

Faz parte do sefazclass.
Estou pensando em modificar os nomes internos pra expandir possibilidades, mas por enquanto só pensando..... rs