Usando la función XMLTOCURSOR()

Hasta ahora hemos visto que al obtener la respuesta del Servidor podíamos usar la función StrExtract() del Visual FoxPro para extraer el texto que se encuentra entre dos delimitadores.

Esa técnica funciona perfectamente bien y generalmente es la recomendable cuando los datos a obtener son pocos. Pero cuando ya hay muchos datos (por ejemplo si en el string con formato XML que recibes del Servidor están los nombres de los clientes, o las ventas del día, o los nombres y precios de los artículos en venta, etc.) hay una mucho mejor alternativa: usar la función XMLtoCursor() del Visual FoxPro.

Esa función lo que hace es convertir la respuesta que recibiste del Servidor en un cursor. Como sabes un cursor es una tabla .DBF pero temporal, al cerrar el cursor se lo elimina del disco duro.

¿Y por qué no usar siempre la función XMLtoCursor()?

Desde luego que podrías hacerlo si así lo quieres pero eso implicará:

  1. Guardar en una variable el alias actual
  2. Ejecutar la función XMLtoCursor()
  3. Procesar el contenido del cursor que obtuviste
  4. Volver a seleccionar el alias que habías guardado

Y corres el riesgo de olvidarte del paso 1. o del paso 4. y según el criterio del autor de este blog eso no se justifica si tienes pocos datos aunque sobre gustos…

Pero si hay muchos datos y esos datos tienen la estructura de una tabla entonces sí se justifica usar la función XMLtoCursor(). Veamos entonces algunos ejemplos:

Listado 1. El Servidor nos devolvió este string

<almuerzo>
<comida>
<Nombre>Ravioles con pollo</Nombre>
<Precio>$5.95</Precio>
<Descripcion>Ravioles con salsa roja o salsa blanca (a eleccion) y un trozo de pollo</Descripcion>
<Calorias>650</Calorias>
</comida>
<comida>
<Nombre>Milanesa a la napolitana</Nombre>
<Precio>$7.95</Precio>
<Descripcion>Milanesa de carne vacuna con tomates y queso arriba</Descripcion>
<Calorias>900</Calorias>
</comida>
<comida>
<Nombre>Tallarines al pesto</Nombre>
<Precio>$8.95</Precio>
<Descripcion>Tallarines con trocitos de carne vacuna y salsa de pesto</Descripcion>
<Calorias>900</Calorias>
</comida>
<comida>
<Nombre>Strogonoff de pollo</Nombre>
<Precio>$4.50</Precio>
<Descripcion>Arroz hervido con trocitos de pollo en su salsa</Descripcion>
<Calorias>600</Calorias>
</comida>
<comida>
<Nombre>Pavo con papas a la crema</Nombre>
<Precio>$6.95</Precio>
<Descripcion>Pavo asado con papas a la crema</Descripcion>
<Calorias>950</Calorias>
</comida>
</almuerzo>

Lo guardamos en un archivo llamado COMIDAS.XML y luego escribimos:

Listado 2. Creando un cursor a partir de un archivo .XML

=XMLtoCursor("COMIDAS.XML", "CURSOR1", 512)

BROWSE

Y lo que veremos será:

Captura 1. El contenido del archivo .XML convertido a un cursor del Visual FoxPro

EL PROBLEMA CON LAS LETRAS ACENTUADAS Y LAS EÑES

Si te fijas en la Captura 1. verás que ninguna palabra está acentuada (o sea que ninguna tiene tilde). Eso es debido a que por defecto cuando queremos convertir un archivo .XML a un cursor las letras que tienen tilde causan un error. Por ejemplo si le ponemos tilde a la palabra elección en el archivo COMIDAS.XML y luego escribimos lo visto en el Listado 2. el resultado que obtendremos será:

Captura 1. La función XMLtoCursor() no acepta letras acentuadas si no están convertidas a UTF-8

Ese «carácter no válido» es la letra ó en elección.

¿Cuál es la solución?

No grabar lo que recibimos del Servidor directamente en un archivo .XML, previamente debemos convertirlo a UTF-8 usando la función StrConv(). Y esa es la explicación de esta línea en el método EJECUTAR_WS() de la clase VFP_WebService.

=StrToFile(StrConv(lcRespuestaWS, 9), tcArchivoRespuesta)    && 9: Convierte doble-bytes caracteres a UTF-8

y entonces, si nuestro archivo .XML tiene letras acentuadas y letras eñes funcionará perfectamente.

Entonces, para asegurarte de que puedes convertir tu archivo .XML a un cursor deberás escribir algo similar a:

Listado 3. Convirtiendo el archivo .XML a UTF-8 y luego a un cursor

lcArchivoXML = FileToStr("COMIDAS.XML")

lcArchivoXML = Strconv(lcArchivoXML, 9)

StrToFile(lcArchivoXML, "COMIDAS.XML")

=XMLToCursor("COMIDAS.XML", "CURSOR1", 512)

BROWSE

y después de eso podrás ver algo como:

Captura 2. Después de convertir el archivo .XML a UTF-8 ya se podrá crear el cursor y se podrán ver las letras acentuadas, las letras u con diéresis y las letras eñes
Captura 3. Otro ejemplo de un archivo .XML convertido a un cursor del Visual FoxPro

El archivo usado en la Captura 3. se llama CATALOGO.XML y lo encontrarás en el archivo .ZIP que puedes descargar

Conclusión

Además de usar la función StrExtract() para extraer el texto que se encuentra entre dos delimitadores también podemos usar la función XMLtoCursor(), la que nos parezca mejor.

En lo particular si el archivo XML tiene pocos datos prefiero usar StrExtract() y si tiene muchos datos o si esos datos están en formato de tabla entonces prefiero usar la función XMLtoCursor(), pero es cuestión de gustos, tú puedes hacer como más te guste.

Descarga

Puedes descargar un archivo .ZIP que contiene varios archivos .XML para que practiques el uso de la función XMLtoCursor() desde:

Artículos relacionados