Análisis XML en Android usando SAX Parser

En general, XML (Lenguaje de marcado extensible) es un formato de intercambio de datos de uso común para intercambiar datos de servidores. En Android, SAX significa API simple para XML y es una API ampliamente utilizada para el análisis de XML. Al igual que el analizador DOM, el analizador SAX también se usa para realizar operaciones en memoria para analizar el documento XML, pero consume menos memoria que el analizador DOM. La principal ventaja de un analizador SAX sobre un analizador DOM es que se puede indicar al analizador SAX que se detenga a la mitad de un documento sin perder los datos recopilados. El archivo XML que contiene la información a extraer incluye los siguientes cuatro componentes principales:

  1. Prólogo: el archivo XML comenzará con un prólogo. Prolog contiene la información sobre un archivo, que está disponible en la primera línea.
  2. Eventos: los eventos como el inicio y el final del documento, el inicio y el final de la etiqueta, etc. están contenidos en el archivo XML
  3. Texto: es un texto simple presente entre los elementos de la etiqueta XML de apertura y cierre.
  4. Atributos: Son las propiedades adicionales de una etiqueta presentes dentro de la etiqueta.

Análisis XML de otras dos formas. Por favor, consulte los siguientes artículos:

¿Qué vamos a hacer?

  1. Necesitamos tener un archivo XML con alguna información para poder hacer uno. Coloque este archivo en la carpeta de activos . Este archivo se llama y se analizará.
  2. Queremos mostrar estos datos en forma de lista para implementar un ListView .
  3. El analizador SAX examina un archivo XML carácter por carácter y traduce el archivo XML en una serie de eventos, como startElement() , endElement() y characters() .
  4. Un objeto ContentHandler procesará estos eventos para realizar la acción adecuada. El método parse() enviará los eventos al objeto de contenido para tratar con ellos.
  5. Cree una instancia de los objetos SAXParserFactory , SAXParser y DefaultHandler en aplicaciones de Android para leer y analizar los datos XML mediante el analizador SAX en Android.
  6. Usando un ListAdapter , los datos se envían a ListView donde se muestran en la pantalla.

Acercarse

Para analizar un archivo XML usando un analizador SAX en Android, siga los siguientes pasos:

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación.

Paso 2: Crea una carpeta de activos

Cree una carpeta de activos debajo de la carpeta principal en el diseño del proyecto . Cree un archivo de recursos de Android en esta carpeta, donde colocaremos la información en forma de XML . Nombre este archivo como userdetails.xml . Para hacerlo, consulte los siguientes pasos:

Haga clic en Proyecto como se muestra en el lado izquierdo de la imagen de abajo. 

Click on project

Expanda hasta encontrar la carpeta principal, haga clic derecho sobre ella, vaya a Nuevo > Carpeta > Carpeta de activos

Asset folder

Luego simplemente haga clic en el botón Finalizar.

asset folder

Ahora la carpeta de activos se crea correctamente. Haga clic con el botón derecho en la Carpeta de activos > Nuevo > Archivo de recursos de Android 

asset folder

Déle el nombre Información, cambie el tipo a XML y finalice.

Nota: a veces, al hacer clic con el botón derecho en la carpeta Activos y crear un archivo de recursos de Android, se crea un archivo en la carpeta res . Si esto sucede, corte nuestro archivo y péguelo directamente en la carpeta de activos . Esto sucede debido a algunas configuraciones internas.

asset folder

Pegue esta información que está en forma de XML, que se mostrará en el archivo userdetails.xml . A continuación se muestra el código para el archivo userdetails.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user>
        <name>Satya</name>
        <designation>CTO</designation>
    </user>
    <user>
        <name>Ajaypal</name>
        <designation>CEO</designation>
    </user>
    <user>
        <name>Mark</name>
        <designation>Consultant</designation>
    </user>
</users>

Paso 3: trabajar con el archivo activity_main.xml

Ahora vaya al archivo activity_main.xml que representa la interfaz de usuario de la aplicación. Cree un ListView como se muestra. actividad_principal.xml

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
  
    <!--A list View that will show the list elements-->
    <ListView
        android:id="@+id/user_list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:dividerHeight="1dp" />
</LinearLayout>

Paso 4: crea otro archivo de diseño

Vaya a aplicación > res > diseño > haga clic con el botón derecho en > Nuevo > Archivo de recursos de diseño y nombre el archivo como lista. El archivo list.xml se usa para mostrar los datos en ListView . lista.xml

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="5dip">
  
    <!--TextView to show the user name-->
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="17dp"
        android:textStyle="bold" />
  
    <!--TextView to show the user designation-->
    <TextView
        android:id="@+id/designation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/name"
        android:layout_marginTop="7dp"
        android:textColor="#343434"
        android:textSize="14dp" />
  
</RelativeLayout>

Paso 5: trabajar con el archivo MainActivity.kt

Finalmente, vaya al archivo MainActivity.kt y consulte el siguiente código. A continuación se muestra el código del  archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender el código con más detalle.

Kotlin

import android.os.Bundle
import android.view.View
import android.widget.ListAdapter
import android.widget.ListView
import android.widget.SimpleAdapter
import androidx.appcompat.app.AppCompatActivity
import org.xml.sax.Attributes
import org.xml.sax.SAXException
import org.xml.sax.helpers.DefaultHandler
import java.io.IOException
import java.util.*
import javax.xml.parsers.ParserConfigurationException
import javax.xml.parsers.SAXParserFactory
  
class MainActivity : AppCompatActivity() {
  
    // Create a userlist
    var userList = ArrayList<HashMap<String, String?>>()
  
    // create a user hashmap
    var user = HashMap<String, String?>()
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        try {
  
            // Declare the list view from the layout file
            val lv = findViewById<View>(R.id.user_list) as ListView
  
            // Creating and initializing an instance of SAX parser factory
            val parserFactory = SAXParserFactory.newInstance()
            val parser = parserFactory.newSAXParser()
  
            // Default handler
            val handler: DefaultHandler = object : DefaultHandler() {
                var currentValue = ""
                var currentElement = false
  
                // Start element function
                @Throws(SAXException::class)
                override fun startElement(
                    uri: String,
                    localName: String,
                    qName: String,
                    attributes: Attributes
                ) {
                    currentElement = true
                    currentValue = ""
                    if (localName == "user") {
                        user = HashMap()
                    }
                }
  
                // End element function
                @Throws(SAXException::class)
                override fun endElement(uri: String, localName: String, qName: String) {
                    currentElement = false
                    when {
                        localName.equals("name", ignoreCase = true) -> user["name"] = currentValue
                        localName.equals("designation", ignoreCase = true) -> user["designation"] = currentValue
                        localName.equals("user", ignoreCase = true) -> userList.add(user)
                    }
                }
  
                // characters function
                @Throws(SAXException::class)
                override fun characters(ch: CharArray, start: Int, length: Int) {
                    if (currentElement) {
                        currentValue += String(ch, start, length)
                    }
                }
            }
  
            // Feeding the userdetails.xml file as an Input stream
            val iStream = assets.open("userdetails.xml")
            parser.parse(iStream, handler)
  
            // Adapter to broadcast the information to the list
            val adapter: ListAdapter = SimpleAdapter(this, userList, R.layout.list,
                arrayOf("name", "designation"), intArrayOf(R.id.name, R.id.designation)
            )
            lv.adapter = adapter
        } catch (e: IOException) {
            e.printStackTrace()
        } catch (e: ParserConfigurationException) {
            e.printStackTrace()
        } catch (e: SAXException) {
            e.printStackTrace()
        }
    }
}

Salida: ejecutar en el emulador

Output

Publicación traducida automáticamente

Artículo escrito por aashaypawar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *