sábado, 22 de noviembre de 2014

Alternativas para leer/escribir XML (y otros ficheros) en Android



En todos los ejemplos anteriores de tratamiento de XML decidí utilizar como entrada un fichero online, que obteníamos desde una determinada URL, porque pensé que sería el caso más típico que íbamos a necesitar en la mayoría de aplicaciones. Sin embargo, quiero también dedicar un capítulo breve a describir la tarea de tratar un fichero XML que se encuentre en un recurso local. Veamos varias alternativas.


Escribir ficheros XML en Android

Para escribir ficheros XML sin meternos en muchas complicaciones innecesarias se me ocurren básicamente dos formas. La primera de ellas, y la más sencilla y directa, es construir manualmente el XML utilizando por ejemplo un objeto StringBuilder y tras esto escribir el resultado a un fichero en memoria interna o externa (no me detendré mucho por ahora en esto último porque dedicaremos al tema un par de capítulos más adelante). Esto quedaría de una forma similar a la siguiente:


Como método alternativo también podemos utilizar el serializador XML incluido con la API XmlPull. Aunque no es un método tan directo como el anterior no deja de ser bastante intuitivo. Los pasos para conseguir esto serán crear el objeto XmlSerializer, crear el fichero de salida, asignar el fichero como salida del serializador y construir el XML mediante los métodos startTag(), text() y endTag() pasándoles los nombres de etiqueta y contenidos de texto correspondientes (aunque existen más métodos, por ejemplo para escribir atributos de una etiqueta, éstos tres son los principales). Finalmente deberemos llamar a endDocument() para finalizar y cerrar nuestro documento XML. Un ejemplo equivalente al anterior utilizando este método sería el siguiente:


Así de sencillo, no merece la pena complicarse la vida con otros métodos más complicados


Leer ficheros XML en Android desde recursos locales

Para leer ficheros XML desde un recurso local se me ocurren varias posibilidades, por ejemplo leerlo desde la memoria interna/externa del dispositivo, leer un XML desde un recurso XML (carpeta /res/xml), desde un recurso Raw (carpeta /res/raw), o directamente desde la carpeta /assets de nuestro proyecto. Salvo en el segundo caso (recurso XML), en todos los demás la solución va a pasar por conseguir una referencia de tipo InputStream (os recuerdo que cualquiera de los métodos que vimos para leer un XML partían de una referencia de este tipo) a partir de nuestro fichero o recurso XML, sea cual sea su localización.

Así, por ejemplo, si el fichero XML está almacenado en la memoria interna de nuestro dispositivo, podríamos acceder a él mediante el método openFileInput() tal como vimos en el capítulo dedicado al tratamiento de ficheros. Este método devuelve un objeto de tipo FileInputStream, que al derivar de InputStream podemos utilizarlo como entrada a cualquiera de los mecanismos de lectura de XML (SAX, DOM, XmlPull).


En el caso de encontrarse el fichero como recurso Raw, es decir, en la carpeta /res/raw, tendríamos que obtener la referencia al fichero mediante el método getRawResource() pasándole como parámetro el ID de recurso del fichero. Esto nos devuelve directamente el stream de entrada en forma de InputStream.


Por último, si el XML se encontrara en la carpeta /assets de nuestra aplicación, accederíamos a él a través del AssetManager, el cual podemos obtenerlo con el método getAssets() de nuestra actividad. Sobre este AssetManager tan sólo tendremos que llamar al método open() con el nombre del fichero para obtener una referencia de tipo InputStream a nuestro XML.


El último caso, algo distinto a los anteriores, pasaría por leer el XML desde un recurso XML localizado en la carpeta /res/xml de nuestro proyecto. Para acceder a un recurso de este tipo debemos utilizar el método getXml() al cual debemos pasarle como parámetro el ID de recurso del fichero XML. Esto nos devolverá un objeto XmlResourceParser, que no es más que un parser de tipo XmlPull como el que ya comentamos en su momento. Por tanto, la forma de trabajar con este parser será idéntica a la que ya conocemos, por ejemplo:


Por último, indicar que todas estas formas de acceder a un fichero en Android no se limitan únicamente a los de tipo XML, sino que pueden utilizarse para leer cualquier otro tipo de ficheros.



Saludos compañeros, aprovechen la información.









No hay comentarios:

Publicar un comentario en la entrada