STREXTRACT()
Después de algunas pruebas de
laboratorio tratando XML desde Fox me tuve que enfrentar con una aplicación
real en un mundo real.
Mi
primera y gran sorpresa es que mientras la función CURSORTOXML es puro fox su
contraria no es tal (XMLTOCURSOR) y usa el parser de Microsoft.
Usar
el Parser de Microsoft no es bueno ni malo, depende de lo que quieras hacer.
Pero, en mi caso me enfrentaba a una colección de instalaciones muy variadas:
no podía ni quería controlar la versión del Internet Explorer que tenían los
usuarios y el Parser que usa Fox en la instrucción XMLTOCURSOR era bastante
exigente con los consiguientes problemas con los usuarios.
En
el camino me encontré con varias soluciones. Una de ellas es usar algún otro
Parser que pueda instalar con mi aplicación y que sea gratuito, rápido y fácil
de instalar. Para esto acudí a ChilkatSoft (reconozco que ultimamente acudo a
él con frecuencia) y vi que tienen un Parser Gratuito.
Cuando
ya estaba trabajando con el Parser gratuito de Chilkatsoft me tropecé con una
función de FoxPro que me podía ayudar en mi trabajo que es STREXTRACT()
Lo
que yo quería es con puro código Fox (sin depender de otros productos o
librerías de Microsoft) poder convertir a XML y poder convertir desde XML. La
conversión a XML es fácil pero ¿Y lo contrario?
Si
tengo un fichero en XML ¿Cómo lo convierto a cursor sin usar el XMLTOCURSOR? En
tu ayuda viene la función STREXTRACT() que podríamos decir que es un Parser
hecho en Fox.
El
ejemplo que viene con la documentación es aplastante y te lo traslado para que
lo veas:
Clear
USE customer && any table
?cursortoxml(0,"x",1,0,2) && Produce variable "x"
that has XML of first 2 records of
table
?x
&& show the XML
xmlproc(x,0) && Parse the XML
PROCEDURE xmlproc(x as String, nLev as
Integer) as void
LOCAL cTagName, cContents, mterm
do
while .t.
cTagName = STREXTRACT(x,"<",">")
IF LEN(cTagName) = 0 &&
no tag found
??' ',x && print out
raw string as contents
exit
endif
IF RIGHT(cTagName,1) = '/'
&& like "<region/>"
cTagName = LEFT(cTagName, LEN(cTagName)-1)
cContents=""
mterm = "<"+cTagName+"/>" && "<region/>"
else
mterm = "</"+cTagName+">" && "</region>"
cContents =
STREXTRACT(x,"<"+cTagName+">", mterm,1,2)
endif
?REPLICATE("
",nLev),nLev+1,PADR(cTagName,20)
xmlproc(cContents, nLev+1)
x = STREXTRACT(x, mterm)
&& get the rest of the xml
enddo
La forma de
usarla es:
STREXTRACT(cSearchExpression, cBeginDelim [, cEndDelim [, nOccurrence[, nFlag]]]])
cSearchExpression
Especifica la cadena que hay que buscar.
cBeginDelim
Especifica el carácter que delimita el principio de cSearchExpression.
cEndDelim
Especifica el carácter que delimita el final de cSearchExpression.
nOccurrence
Especifica la instancia de cBeginDelim en
cSearchExpression en la que se inicia la extracción.
nFlag
Una
Alternativa si no quieres usar el Parser Microsoft es usar el que te proporciona
gratuitamente la empresa Chilkatsoft. En números anteriores de esta revista se
usó el control de mensajería que entonces también era gratuito. Fruto del
volumen de descargas que se produjeron el control pasó a ser de pago. El Parser
que todavía cuando escribo estas líneas es gratuito te lo puedes bajar de: http://www.chilkatsoft.com/ChilkatXml.exe
El parser XML de ChilkatSoft te da un API más simplificado que el XML DOM. El control se puede poner en un formulario y crear un objeto ChilkatXml vacío que se puede usar como un punto de partida para cargar o crear documentos XML. La última versión incorpora el soporte para XMLHTTP con lo que se puede usar un método HTTPPost que lo que hace es enviar a una web una página con contenido XML para su procesamiento.
FoxPress – Mayo de 2003
© 2003 FoxPress. All rights reserved