Página 1 de 1

Duvida função xmlnode

Enviado: 27 Jan 2023 19:53
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 698 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.

Duvida função xmlnode

Enviado: 27 Jan 2023 21:08
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.

Duvida função xmlnode

Enviado: 28 Jan 2023 04:13
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

Duvida função xmlnode

Enviado: 29 Jan 2023 14:04
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.

Duvida função xmlnode

Enviado: 29 Jan 2023 16:38
por JoséQuintas
Retornar só o conteúdo ou o conjunto com início e fim

Duvida função xmlnode

Enviado: 02 Fev 2023 11:00
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.

Duvida função xmlnode

Enviado: 02 Fev 2023 11:08
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.