Página 1 de 1

Visualizar XML

Enviado: 01 Out 2016 10:46
por JoséQuintas
Alguém chegou a montar alguma coisa pra visualizar XML?
Tentei assim, mas é pouco ainda.

Código: Selecionar todos


#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""

   FOR EACH cLetra IN cText
      IF cLetra == "<"
         nAbreFecha := iif( Substr( cText, cLetra:__EnumIndex + 1, 1 ) != "/", NODE_ABRE, NODE_FECHA )
         IF nAbreFecha == NODE_ABRE .OR. ( nAbreFecha == NODE_FECHA .AND. nAbreFechaAnterior == NODE_FECHA )
            AAdd( aTextList, cText2 )
            cText2 := ""
         ENDIF
         nAbreFechaAnterior := nAbreFecha
      ENDIF
      cText2 += cLetra
   NEXT
   IF ! Empty( cText2 )
      AAdd( aTextList, cText2 )
   ENDIF
   FOR EACH oElement IN aTextList
      nCol -= iif( Left( oElement, 2 ) == "</", 3, 0 )
      oElement := Pad( Space( nCol ) + oElement, 98 )
      nCol += iif( ! "</" $ oElement .AND. ! "/>" $ oElement, 3, 0 )
   NEXT

   CLS
   AChoice( 1, 1, 39, 99, aTextList )

   RETURN
testexml.png
Nota: seria pra visualizar sem existir arquivo XML em disco.

Visualizar XML

Enviado: 01 Out 2016 11:47
por JoséQuintas
Ainda não está bom, mas tá interessante, entrando e saindo dos blocos..
Com uso de recursividade:
A função chamando ela mesma. Nessas horas, variáveis locais é de extrema importância.

Código: Selecionar todos


#include "inkey.ch"
#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""

   FOR EACH cLetra IN cText
      IF cLetra == "<"
         nAbreFecha := iif( Substr( cText, cLetra:__EnumIndex + 1, 1 ) != "/", NODE_ABRE, NODE_FECHA )
         IF nAbreFecha == NODE_ABRE .OR. ( nAbreFecha == NODE_FECHA .AND. nAbreFechaAnterior == NODE_FECHA )
            IF ! Empty( cText2 )
               AAdd( aTextList, cText2 )
            ENDIF
            cText2 := ""
         ENDIF
         nAbreFechaAnterior := nAbreFecha
      ENDIF
      cText2 += cLetra
   NEXT
   IF ! Empty( cText2 )
      AAdd( aTextList, cText2 )
   ENDIF
   FOR EACH oElement IN aTextList
      nCol     -= iif( Left( oElement, 2 ) == "</", 3, 0 )
      oElement := Pad( Space( nCol ) + oElement, 98 )
      nCol     += iif( ! "</" $ oElement .AND. ! "/>" $ oElement, 3, 0 )
   NEXT

   Inkey(0)
   CLS
   TBrowseXml( 1, aTextList, "XML" )

   RETURN

FUNCTION TBrowseXml( nRow, aTextList, cTitulo )

   LOCAL aSubText := {}, oElement, nCol, aItem := {}, nOpc, nBegin, aNewText := {}, cLetra, nCont, cTelaSalva

   IF Len( aTextList ) == 0
      RETURN NIL
   ENDIF
   nCol := 0
   FOR EACH cLetra IN aTextList[ 1 ]
      IF cLetra != " "
         EXIT
      ENDIF
      nCol += 1
   NEXT
   FOR EACH oElement IN aTextList
      IF ! Substr( oElement, nCol + 1, 1 ) == " " .OR. Len( oElement ) < nCol
         AAdd( aSubText, oElement )
         AAdd( aItem, oElement:__EnumIndex )
      ENDIF
   NEXT

   DO WHILE .T.
      @ nRow, nCol - 1 CLEAR TO Min( nRow + Len( aSubText ) + 2, 40 ), 100
      @ nRow, nCol - 1 TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
      @ nRow, nCol - 1 + 20 SAY cTitulo COLOR "N/W"
      nOpc := AChoice( nRow + 1, nCol, Min( nRow + Len( aSubText ) + 2, 39 ), 99, aSubText )

      IF LastKey() == K_ESC
         EXIT
      ENDIF
      nBegin := aItem[ nOpc ]
      FOR nCont = nBegin + 1 TO Len( aTextList )
         IF Substr( aTextList[ nCont ], nCol + 1, 1 ) != " "
            EXIT
         ENDIF
         AAdd( aNewText, aTextList[ nCont ] )
      NEXT
      SAVE SCREEN TO cTelaSalva
      TBrowseXml( nRow + 1, aNewText, aSubText[ nOpc ] )
      RESTORE SCREEN FROM cTelaSalva
   ENDDO

   RETURN NIL
testexml.png

Visualizar XML

Enviado: 01 Out 2016 11:54
por JoséQuintas
A título de curiosidade:

Neste bloco, verifico em que coluna começa o primeiro texto, que é a coluna que vai ser tratada no browse:

Código: Selecionar todos

   nCol := 0
   FOR EACH cLetra IN aTextList[ 1 ]
      IF cLetra != " "
         EXIT
      ENDIF
      nCol += 1
   NEXT
Então, pego todos os títulos na mesma coluna, guardando o título e a posição na lista geral

Código: Selecionar todos

   FOR EACH oElement IN aTextList
      IF ! Substr( oElement, nCol + 1, 1 ) == " " .OR. Len( oElement ) < nCol
         AAdd( aSubText, oElement )
         AAdd( aItem, oElement:__EnumIndex )
      ENDIF
   NEXT
Com a opção escolhida, vou lá no array, e pego tudo dentro dele, baseado em que tudo vai ter espaço em branco no início.

Código: Selecionar todos

      nBegin := aItem[ nOpc ]
      FOR nCont = nBegin + 1 TO Len( aTextList )
         IF Substr( aTextList[ nCont ], nCol + 1, 1 ) != " "
            EXIT
         ENDIF
         AAdd( aNewText, aTextList[ nCont ] )
      NEXT
Uma vez com o array interno pronto, só chamar a própria rotina, e tudo vai se repetindo.

Código: Selecionar todos

      TBrowseXml( nRow + 1, aNewText, aSubText[ nOpc ] )

Visualizar XML

Enviado: 01 Out 2016 17:00
por JoséQuintas
Melhorei um pouquinho pra tags <.../> e pra não cortar a linha, senão corta a tag final.
E um pouquinho o visual da navegacão.

Código: Selecionar todos


#include "inkey.ch"
#include "hbgtinfo.ch"
#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""

   FOR EACH cLetra IN cText
      IF cLetra == "<"
         nAbreFecha := iif( Substr( cText, cLetra:__EnumIndex + 1, 1 ) != "/", NODE_ABRE, NODE_FECHA )
         IF nAbreFecha == NODE_ABRE .OR. ( nAbreFecha == NODE_FECHA .AND. nAbreFechaAnterior == NODE_FECHA )
            IF ! Empty( cText2 )
               AAdd( aTextList, cText2 )
            ENDIF
            cText2 := ""
         ENDIF
         nAbreFechaAnterior := nAbreFecha
      ENDIF
      cText2 += cLetra
      IF cLetra = ">" .AND. Substr( cText, cLetra:__EnumIndex - 1, 1 ) == "/"
         IF ! Empty( cText2 )
            AAdd( aTextList, cText2 )
            cText2 := ""
         ENDIF
      ENDIF
   NEXT
   IF ! Empty( cText2 )
      AAdd( aTextList, cText2 )
   ENDIF
   FOR EACH oElement IN aTextList
      nCol     -= iif( Left( oElement, 2 ) == "</", 3, 0 )
      oElement := Space( nCol ) + oElement
      nCol     += iif( ! "</" $ oElement .AND. ! "/>" $ oElement, 3, 0 )
      //? oElement
      //Inkey(1)
   NEXT

   TBrowseXml( 1, 1, aTextList, "XML" )

   RETURN

FUNCTION TBrowseXml( nRow, nCol, aTextList, cTitulo )

   LOCAL aSubText := {}, oElement, nPos, aItem := {}, nOpc, nBegin, aNewText := {}, cLetra, nCont, cTelaSalva

   IF Len( aTextList ) == 0
      RETURN NIL
   ENDIF
   nPos := 0
   FOR EACH cLetra IN aTextList[ 1 ]
      IF cLetra != " "
         EXIT
      ENDIF
      nPos += 1
   NEXT
   FOR EACH oElement IN aTextList
      IF ! Substr( oElement, nPos + 1, 1 ) == " " .OR. Len( oElement ) < nPos
         AAdd( aSubText, oElement )
         AAdd( aItem, oElement:__EnumIndex )
      ENDIF
   NEXT

   DO WHILE .T.
      @ nRow, nCol - 1 CLEAR TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
      @ nRow, nCol - 1 TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
      @ nRow, nCol - 1 + 20 SAY cTitulo COLOR "W/GR+"
      nOpc := AChoice( nRow + 2, nCol, Min( nRow + Len( aSubText ) + 2, 39 ), 99, aSubText )

      IF LastKey() == K_ESC
         EXIT
      ENDIF
      nBegin := aItem[ nOpc ]
      FOR nCont = nBegin + 1 TO Len( aTextList )
         IF Substr( aTextList[ nCont ], nPos + 1, 1 ) != " "
            EXIT
         ENDIF
         AAdd( aNewText, Substr( aTextList[ nCont ], nPos + 2 ) )
      NEXT
      SAVE SCREEN TO cTelaSalva
      TBrowseXml( nRow + 2, nCol + 5, aNewText, aSubText[ nOpc ] )
      RESTORE SCREEN FROM cTelaSalva
   ENDDO

   RETURN NIL
A partir daí, só com biblioteca visual pra melhorar.
testexml.png

Visualizar XML

Enviado: 01 Out 2016 17:02
por JoséQuintas
A propósito, errei na parte mais simples:

Código: Selecionar todos

@ nRow, nCol - 1 CLEAR TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
@ nRow, nCol - 1 TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
Se é 40 linhas por 100 colunas, os maximos são 39 e 99..... rs

Visualizar XML

Enviado: 01 Out 2016 17:07
por JoséQuintas
Após correção, deu até pra ver um bug no Windows (acho)
Reparem a cor da janela, CLS não preencheu toda janela do prompt.
testexml.png

Visualizar XML

Enviado: 01 Out 2016 19:21
por runner
Olá, José Quintas.


Era justamente o que eu estava precisando, agradeço o seu apoio, agora não vou mais precisar gravar os meus xmls para geração da NFe, CTe e MDFe.

Visualizar XML

Enviado: 03 Out 2016 09:01
por gilbertosilverio
Ola Jose,

Instalei a versão hb34 em uma maquina zerada, pra poder testa-lo, pois uso em produção uma versao do XHB 1.10 e HWGUI do BASSO que funcionava normalmente ate as ultimas atualizaçoes do W10, gostaria de poder usar uma verão mais nova do HB, pra não ficar parado, e ver se estes problemas que começaram a aparecer, seram resolvidos.

Este teu exemplo, para ler xml, compila normalmente, mais quando executo da a mensagem de erro:
error base/1070 arqgument error: ==

Como não cria nem log de erro, deduzi que o erro esta nesta linha, nCol -= iif( Left( oElement, 2 ) == "" $ oElement, 3, 0 )

To apanhando um bocado, pra usar o HBMK2, ja li varios tutoriais de como usa-lo, mais a maioria do prgs que compilo, da erro ou não executa.

Como devo compilar este prg, fiz assim: HBMK2 TESTE_ZE.PRG, alguma dica?

Grato.

Visualizar XML

Enviado: 03 Out 2016 09:45
por JoséQuintas
Uma coisa é o Harbour sozinho, console.
Outra coisa é o Harbour sozinho ou com lib gráfica, ambiente gráfico.

No ambiente gráfico, se o EXE se fecha, a janela se fecha, o que fecha junto a janela de erros.

Eu uso uma errorsys que modifiquei pra abrir no bloco de notas.

Compilei normal, sem precisar adicionar nenhuma LIB. (com Harbour 3.4)

Código: Selecionar todos

hbmk2 teste 
Convém lembrar que usei um determinado xml de teste.
Não sei se XMLs errados, ou XML contendo alguma coisa não prevista, possa causar erro.

Visualizar XML

Enviado: 03 Out 2016 09:57
por gilbertosilverio
Jose,

Tentei com diversos xmls de NFes validadas, autorizadas, etc, mais nenhuma abre...

Compilei igual ao que voce reportou, o HB34 que montei, segui o teu exemplo de como instalar o HB34 que voce postou aqui no forum em um maquina zerada, para não ter "sujeiras" de outras versões.

Vou tentar identificar o que acontece, e depois reporto aqui.

Grato.

Visualizar XML

Enviado: 03 Out 2016 10:02
por JoséQuintas
Complemento:
Dá pra encontrar a errorsys que uso aqui:

https://github.com/JoseQuintas/AllInOne

Nesse caso, para compilar o teste com a errorsys:

Código: Selecionar todos

hbmk2 teste errorsys

Visualizar XML

Enviado: 03 Out 2016 10:23
por JoséQuintas
To apanhando um bocado, pra usar o HBMK2, ja li varios tutoriais de como usa-lo, mais a maioria do prgs que compilo, da erro ou não executa.
hbmk2 é pra ajudar a compilar, mas ele não faz mágica.
Tanto faz linha de comando, ou usando um HBP, os comandos são os mesmos, a diferença em HBP é separar um comando por linha.

Se forem exemplos criados usando a compilação -w3 -es2, então facilita se compilar igual, pra identificar se falta alguma coisa.
É que se não forem criados com isso, vai acusar muito mais erros, e complica... rs

basicamente é apenas colocar a lista de fontes.
Se os fontes usam arquivo .CH, ou biblioteca adicional, precisa indicar isso também no HBP. (ou linha de comando).
O hbmk2 só busca automático a parte básica

esse exemplo com console:

Código: Selecionar todos

hbmk2 test
esse exempo com gtwvg:

Código: Selecionar todos

hbmk2 test gtwvg.hbc
supondo que pegue um exemplo que use funções da gtwvg, ou funções da hbwin, etc.

Código: Selecionar todos

hbmk2 test hbwin.hbc gtwvg.hbc
e se for usando arquivo hbp:

Código: Selecionar todos

#arquivo.hbp
test
hbwin.hbc
gtwvg.hbc

Código: Selecionar todos

hbmk2 arquivo.hbp
Lembre-se do Clipper.

um fonte do clipper:

Código: Selecionar todos

clipper teste
rtlink fi teste
se no fonte usa diferente do padrão, por exemplo uma biblioteca que não é do Clipper:

Código: Selecionar todos

clipper teste
rtlink fi teste lib outralib
se as libs do clipper não estão na pasta atual, ou indica SET LIB=c:\pasta ou:

Código: Selecionar todos

clipper teste
rtlink fi teste lib c:\clipper\clipper, c:\clipper\dbfntx, c:\clipper\extend, c:\tools\outralib
Não é o hbmk2 que é complicado, é que acostumamos com tudo automático, e esquecemos do básico.
SET PATH, SET LIB, SET OBJ
Com Clipper é muito mais complicado do que com Harbour/hbmk2.

Mas tem um porém ai:
Também estão chamando de Harbour TUDO, e não é tudo.
hwgui, minigui, qt, etc. são bibliotecas adicionais, que necessitam configuracões adicionais.
hbide é um ambiente de compilação que também exige configurações especificas.

E dependendo de onde obter o Harbour, ele pode ou não vir com o compilador C junto.
Se o compilador C estiver no lugar adequado, e configurado no PATH, o hbmk2 pega automático.

Não queira testar tudo que é exemplo do jeito padrão, porque depende se o exemplo usa alguma lib adicional, pra indicar algo mais no HBP/linha de comando.

Visualizar XML

Enviado: 03 Out 2016 10:38
por JoséQuintas
Dica pra usar o debug do Harbour, que é igual ao do Clipper:

coloquei um inkey(0) no início do fonte principal:

Código: Selecionar todos

#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""
   Inkey(0)
compilei usando -b

Código: Selecionar todos

hbmk2 test -b
Ao executar test, tecle Alt-D, e depois espaço (não sei porque precisa o espaco, mas tudo bem).
debug.png
Depois disso pode ir teclando F8, e acompanhar linha a linha.

Visualizar XML

Enviado: 03 Out 2016 13:11
por gilbertosilverio
Jose,

Muito obrigado pelas dicas, consegui fazer funcionar... vou agora tentar compilar a HWGUI 220 e ver como se comporta.

Visualizar XML

Enviado: 03 Out 2016 19:14
por alxsts
Olá!
JoséQuintas escreveu:coloquei um inkey(0) no início do fonte principal:
Ao invés de Inkey(0), pode colocar direto uma ou várias chamadas à função AltD() nos pontos onde desejar parar o programa.