Duvida função xmlnode

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Duvida função xmlnode

Mensagem por Itamar M. Lins Jr. »

Olá!

Código: Selecionar todos

FUNCTION XmlNode( cXml, cNode, lComTag )
   LOCAL nInicio, nFim, cResultado := ""

   hb_Default( @lComTag, .F. )
   nInicio := At( "<" + cNode, cXml )
   // a linha abaixo é depois de pegar o início, senão falha
   IF " " $ cNode
      cNode := Substr( cNode, 1, At( " ", cNode ) - 1 )
   ENDIF
   IF nInicio != 0
      IF ! lComTag
         nInicio := nInicio + Len( cNode ) + 2
         IF nInicio != 1 .AND. Substr( cXml, nInicio - 1, 1 ) != ">" // Quando tem elementos no bloco
            nInicio := hb_At( ">", cXml, nInicio ) + 1
         ENDIF
      ENDIF
      nFim := hb_At( "</" + cNode + ">", cXml, nInicio )      
      IF nFim != 0
         nFim -= 1
         IF lComTag
            nFim := nFim + Len( cNode ) + 3
         ENDIF
         cResultado := Substr( cXml, nInicio, nFim - nInicio + 1 )
      ENDIF
   ENDIF

   RETURN cResultado
Tá pegando valores de nomes de tags errados.
A tag se chama: <vBCSTRet>446.31</vBCSTRet>
Entretanto ele pega e joga na tag: nVBC := Val( XmlNode(cTagDetItemX, "vBC") )
Captura de tela 2023-01-27 200554.png
Captura de tela 2023-01-27 200554.png (4.71 KiB) Exibido 703 vezes
Veja na imagem que os valores estão no campo BCICMS e está errado, somente último item era para esta com valor.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Duvida função xmlnode

Mensagem por Itamar M. Lins Jr. »

Olá
Fiz esse FIX.

Código: Selecionar todos

FUNCTION XmlNode( cXml, cNode, lComTag, lExact )
   LOCAL nInicio, nFim, cResultado := ""

   hb_Default( @lComTag, .F. )
   hb_Default( @lExact, .F. )
   nInicio := At( "<" + cNode, cXml )
   // a linha abaixo é depois de pegar o início, senão falha
   IF " " $ cNode
      cNode := Substr( cNode, 1, At( " ", cNode ) - 1 )
   ENDIF
   IF nInicio != 0
      IF ! lComTag
         nInicio := nInicio + Len( cNode ) + 2         
         IF nInicio != 1 .AND. Substr( cXml, nInicio - 1, 1 ) != ">" // Quando tem elementos no bloco
            IF lExact
               RETURN cResultado
            ELSE 
               nInicio := hb_At( ">", cXml, nInicio ) + 1
            ENDIF
         ENDIF
      ENDIF
      nFim := hb_At( "</" + cNode + ">", cXml, nInicio )      
      IF nFim != 0
         nFim -= 1
         IF lComTag
            nFim := nFim + Len( cNode ) + 3
         ENDIF
         cResultado := Substr( cXml, nInicio, nFim - nInicio + 1 )
      ENDIF
   ENDIF

   RETURN cResultado
Coloquei esse parâmetro -> lExact

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Duvida função xmlnode

Mensagem por JoséQuintas »

Acho que esse fix não dá certo.
Talvez procurar "<x>" ou "<x " com espaço.
Do jeito que fez, o espaço pode estar em qualquer posição.

<x>
<x versao='1'>

falta testar, talvez:

Código: Selecionar todos

nInicio := At( "<" + cNode + ">", cXml )
IF nInicio == 0
   nInicio := At( "<" + cNode + " ", cXml )
ENDIF
Isso evita pegar errado <xx por exemplo
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Duvida função xmlnode

Mensagem por Itamar M. Lins Jr. »

Olá!
Da forma que fiz, funcionou e da sua forma também.
Agora:
IF ! lComTag
nInicio := nInicio + Len( cNode ) + 2
IF nInicio != 1 .AND. Substr( cXml, nInicio - 1, 1 ) != ">" // Quando tem elementos no bloco
Essa parte, elementos do bloco, que não entendi.
Já que não vi o uso de lComTag := .T., não sei a diferença.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Duvida função xmlnode

Mensagem por JoséQuintas »

Retornar só o conteúdo ou o conjunto com início e fim
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Duvida função xmlnode

Mensagem por JoséQuintas »

Com a mudança que eu fiz deu um problema na carta de correção.
Vou inverter pra resolver, mas.... de qualquer jeito tem esse risco.

Na carta de correção tem

[infEvento xxxx]
[infEvento]

O que interessa é o primeiro, e estava pegando o segundo.
Na análise antiga [infEvento era pego o primeiro, porque não importava se era com ou sem espaço.
Na análise seguinte, [infEvento] era pego primeiro, porque a análise testava sem espaço primeiro.
Talvez tenha que complicar um pouco essa parte: testar os dois, e pegar o menor que não seja zero.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Duvida função xmlnode

Mensagem por JoséQuintas »

Código: Selecionar todos

   hb_Default( @lComTag, .F. )
   nInicio  := At( "<" + cNode + ">", cXml )
   nInicio2 := At( "<" + cNode + " ", cXml )
   IF nInicio == 0
      nInicio := nInicio2
   ELSEIF nInicio2 != 0 .AND. nInicio2 < nInicio
      nInicio := nInicio2
   ENDIF
Ficou assim.
Vai pegar o primeiro dos dois que aparecer.
Ao mesmo tempo que retorna o que era antes, vai impedir de pegar errado, que foi o motivo da mudança anterior.
[infEvento] ok
[infEvento xxxx] ok
mas [infEventoxxxx] grudado não pega, que era o problema inicial deste post

E pega o primeiro que aparecer, e evita erro no PDF da carta de correção, causado pela mudança anterior.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder