FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour (OT Harbour) Xml - Búsqueda bestia
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
(OT Harbour) Xml - Búsqueda bestia
Posted: Mon Jun 19, 2017 10:22 AM
Hola a todos,

Teniendo un xml tal que así:

Code (fw): Select all Collapse
<Principal>
   <Desglose>
      <Auxiliar>
          <Precio>10.1</Precio>
      </Auxiliar>
   </Desglose>
</Principal>


Habria alguna forma de hacer una busqueda DIRECTA a "Precio", es decir, buscando el tag "Precio", devuelva la cadena de jerarquia donde se encuentra, que seria en el ejemplo: Principal, Desglose, Auxiliar.
Se me ocurren varias formas, nada ortodoxas, a cual de ellas peor :-) pero no quiero reinventar la rueda y tampoco inventar el hilo negro y mucho menos matar moscas a cañonazos. :-)
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: (OT Harbour) Xml - Búsqueda bestia
Posted: Mon Jun 19, 2017 12:44 PM

prueba asi

local cSrcFileName := "Archivo.xml"
local cNodeName := "Precio"
local cNodeString := ''
local cNodeBegTag := "<Precio"
local cNodeEndTag := "</Precio>"
local cSrcString

    cSrcString := HB_MEMOREAD( cSrcFileName )
    cNodeString:= HL_ExtrcSIS( cSrcString, cNodeBegTag, cNodeEndTag )
    ?  &quot;&lt;Precio&quot;+cNodeString+&quot;&lt;/Precio&gt;&quot;

RETURN
procedure HL_ExtrcSIS(; // Extract String IN String
cUpStr,; // Up-String
cDelm1,; // Delimiter - 1
cDelm2) // Delimiter - 2

LOCAL cRVal := '',;
nPos1 := 0,;
nPos2 := 0

IF !EMPTY( cUpStr ) .AND. !EMPTY( cDelm1 ) .AND. (!EMPTY( cDelm2 ) .OR. cDelm2 == CRLF ) // A517..21

  IF cDelm1 $ cUpStr
     nPos1 := AT( cDelm1, cUpStr ) +  LEN( cDelm1 )
     IF cDelm2 $ SUBS( cUpStr, nPos1 )
      inkey(.<!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->
        nPos2  := HL_PAT( nPos1, cDelm2, cUpStr )
        cRVal  := SUBS( cUpStr, nPos1, nPos2-nPos1 )
        cUpStr := SUBS( cUpStr, 1, nPos1 - LEN( cDelm1 )  - 1 ) + SUBS( cUpStr, nPos2 + LEN(cDelm2) )
     ELSE
        cRVal  := SUBS( cUpStr, nPos1 )
        cUpStr := LEFT( cUpStr, nPos1 )
     ENDIF cDelm2 $ SUBS( cUpStr, nPos1 )
  ENDIF cDelm1 $ cUpStr

ENDIF !EMPTY( cUpStr ) .AND. !EMPTY( cDelm1 ) .AND. !EMPTY( cDelm2 ) // A517

RETU cRVal // HL_ExtrcSIS()

PROCEDURE HL_PAT(nBasPos,cAraKtr, cInKtr)

LOCAL nRVal := 0

IF nBasPos <= LEN( cInKtr )
nRVal := AT( cAraKtr, SUBS( cInKtr, nBasPos ) )
IF nRVal > 0
nRVal := nBasPos + nRVal - 1
ENDI
ENDIF nBasBos <= LEN( cAraKtr )

RETU nRVal

SALUDOS

Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: (OT Harbour) Xml - Búsqueda bestia
Posted: Mon Jun 19, 2017 01:38 PM

jbrita,

Gracias por tu codigo

¿ lo tienes en produccion ?
¿ Tendrías algo similar pero para hashes ?

Saludos

Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: (OT Harbour) Xml - Búsqueda bestia
Posted: Tue Jun 20, 2017 03:38 PM
Mira de usar mxmlFindPath
https://michaelrsweet.github.io/mxml/mxml.html#3_8

Y si no, puedes convertir tu xml a un hash a traves de xmltohash() , http://xthefull.blogspot.com.es/2017/04/convertir-xml-hash-en-harbour-update-v.html
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: (OT Harbour) Xml - Búsqueda bestia
Posted: Tue Jun 20, 2017 05:58 PM

Rafa, gracias por la respuesta.

Yo habia pensado en un hb_hascan() que buscara una key y devolviera los nodos padre para llegar hasta el.
La verdad, pensé que quizá ya lo tenía harbour, puesto que me pareció una operación de hashes que podría ser habitual.

Saludos.

Continue the discussion