Cómo hacer esta sustitución?

116 views
Skip to first unread message

Miguel A.

unread,
Apr 7, 2016, 6:34:41 AM4/7/16
to Comunidad de Visual Foxpro en Español
Hola, 
A la hora de confeccionar un fichero XML necesito sustituir todos los caracteres ampersand por "&"  para que sea reconocido este carácter por la codificación UTF-8, así que he hecho:

lcCadena=STRTRAN(lcCadena,'&','&')

El error es evidente porque vuelve a encontrar un nuevo "&" y al final lo único que hace es añadir infinitos "amp;" después de "&".
¿Alguna idea de cómo hacer esto?. Gracias,

Miguel A.

francisco prieto

unread,
Apr 7, 2016, 6:45:42 AM4/7/16
to Comunidad de Visual Foxpro en Español
Si, proba asi

lcCadena=STRTRAN(lcCadena,chr(38),chr(38)+'amp')

Saludos,

Pancho
Córdoba
Argentina

Fernando D. Bozzo

unread,
Apr 7, 2016, 9:16:51 AM4/7/16
to Comunidad de Visual Foxpro en Español
Hola Miguel:

Tratar con XML implica algo más que sustituir los "&".

Te dejo un par de funciones de conversión que tienen lo mínimo y necesario para convertir a y desde XML.

FUNCTION NormalizarValorXML(tcTexto)
    *-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES.
    tcTexto = STRTRAN(tcTexto, CHR(38), CHR(38) + 'amp;')    && reemplaza &  por  &        &&
    tcTexto = STRTRAN(tcTexto, CHR(39), CHR(38) + 'apos;')    && reemplaza '  por  '        &&
    tcTexto = STRTRAN(tcTexto, CHR(34), CHR(38) + 'quot;')    && reemplaza "  por  "        &&
    tcTexto = STRTRAN(tcTexto, '<', CHR(38) + 'lt;')         &&  reemplaza <  por  &lt;        &&
    tcTexto = STRTRAN(tcTexto, '>', CHR(38) + 'gt;')        &&  reemplaza >  por  &gt;        &&
    tcTexto = STRTRAN(tcTexto, CHR(13)+CHR(10), CHR(10))    && reeemplaza CR+LF por LF
    tcTexto = CHRTRAN(tcTexto, CHR(13), CHR(10))            && reemplaza CR por LF
    RETURN tcTexto
ENDFUNC


FUNCTION DesnormalizarValorXML(tcTexto)
    *-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES.
    LOCAL lnPos, lnAscii
    tcTexto    = STRTRAN(tcTexto, CHR(38)+'gt;', '>')            &&    >
    tcTexto    = STRTRAN(tcTexto, CHR(38)+'lt;', '<')            &&    <
    tcTexto    = STRTRAN(tcTexto, CHR(38)+'quot;', CHR(34))    &&    "
    tcTexto    = STRTRAN(tcTexto, CHR(38)+'apos;', CHR(39))    &&    '
    tcTexto    = STRTRAN(tcTexto, CHR(38)+'amp;', CHR(38))        &&    &
    DO WHILE .T.
        lnPos    = AT( CHR(38)+'#x', tcTexto )
        IF lnPos = 0
            EXIT
        ENDIF
        lnAscii    = EVALUATE( '0' + SUBSTR( tcTexto, lnPos + 2, 3 ) )
        tcTexto    = STUFF(tcTexto, lnPos, 6, CHR(lnAscii))        &&    ASCII
    ENDDO
    RETURN tcTexto
ENDPROC


Saludos.-

Miguel A.

unread,
Apr 7, 2016, 1:59:33 PM4/7/16
to Comunidad de Visual Foxpro en Español
Gracias Fernando,
Reply all
Reply to author
Forward
0 new messages