Generación de archivos XML en Android con XmlSerializer

Este artículo detalla el proceso para crear archivos XML de forma programática en aplicaciones Android utilizando la clase XmlSerializer. Para interactuar con el almacenamiento externo del dispositivo, es necesario declarar el permiso correspondiente en el archivo AndroidManifest.xml.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

El procedimiento general implica los sigueintes pasos:

  1. Instanciar un objeto XmlSerializer.
  2. Crear un archivo en el almacenamiento externo y obtener un FileOutputStream para escribir en él.
  3. Utilizra los métodos de XmlSerializer para escribir los datos XML en el flujo de salida.

A continuación, se presenta un ejemplo de implementación en Java:


package com.example.xmlwriter;

import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Xml;
import android.widget.Toast;

import org.xmlpull.v1.XmlSerializer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       generateXmlFile();
   }

   private void generateXmlFile() {
       try {
           // Obtener el directorio del almacenamiento externo y definir el nombre del archivo
           File xmlFile = new File(getExternalFilesDir(null), "data_records.xml");
           
           // Crear un flujo de salida para el archivo
           FileOutputStream outputStream = new FileOutputStream(xmlFile);
           
           // Crear una instancia de XmlSerializer
           XmlSerializer serializer = Xml.newSerializer();
           
           // Configurar el flujo de salida y la codificación
           serializer.setOutput(outputStream, "UTF-8");
           
           // Iniciar el documento XML y definir la codificación
           serializer.startDocument("UTF-8", true);
           
           // Añadir un comentario al XML
           serializer.comment("Archivo de datos de ejemplo generado automáticamente");
           
           // Iniciar el elemento raíz
           serializer.startTag(null, "records");
           
           // Primer registro
           serializer.startTag(null, "record");
           serializer.text("Primer elemento");
           serializer.endTag(null, "record");
           
           // Segundo registro con atributo
           serializer.startTag(null, "record");
           serializer.attribute(null, "type", "important");
           serializer.text("Segundo elemento con atributo");
           serializer.endTag(null, "record");
           
           // Tercer registro con sub-elementos
           serializer.startTag(null, "record");
           serializer.startTag(null, "subRecord");
           serializer.attribute(null, "id", "sub-001");
           serializer.text("Contenido del sub-elemento");
           serializer.endTag(null, "subRecord");
           serializer.endTag(null, "record");
           
           // Cerrar el elemento raíz
           serializer.endTag(null, "records");
           
           // Finalizar el documento XML
           serializer.endDocument();
           
           // Asegurarse de que todos los datos se escriban
           serializer.flush();
           
           // Cerrar el flujo de salida
           outputStream.close();
           
           Toast.makeText(this, "Archivo XML generado exitosamente en: " + xmlFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
           
       } catch (IOException e) {
           e.printStackTrace();
           Toast.makeText(this, "Error al generar el archivo XML", Toast.LENGTH_SHORT).show();
       } catch (Exception e) {
           e.printStackTrace();
           Toast.makeText(this, "Error inesperado", Toast.LENGTH_SHORT).show();
       }
   }
}
   

El archivo XML resultante tendrá una estructura similar a la siguiente:


<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<!-- Archivo de datos de ejemplo generado automáticamente -->
<records>
   <record>Primer elemento</record>
   <record type="important">Segundo elemento con atributo</record>
   <record>
       <subRecord id="sub-001">Contenido del sub-elemento</subRecord>
   </record>
</records>
   

Etiquetas: Android XML XmlSerializer Programación Android Android Internals

Publicado el 7-9 22:09