Análisis XML en Android usando DOM Parser

El analizador Android DOM (Document Object Model) es un programa que analiza un documento XML y extrae la información requerida de él. Este analizador utiliza un enfoque basado en objetos para crear y analizar los archivos XML. En general, un analizador DOM carga el archivo XML en la memoria de Android para analizar el documento XML. Esto da como resultado un mayor consumo de memoria. El documento se analiza a través de todos los Nodes posibles en el archivo XML. 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 una vista de lista.
  3. En el programa Principal, llamamos al archivo de información (en la carpeta de activos) desde la carpeta de activos, y esto se proporciona como un flujo de entrada.
  4. Usando un DocumentBuilderFactory , crearíamos una nueva instancia.
  5. Usando un DocumentBuilder , generamos un nuevo generador de documentos.
  6. Usando un método Document , analizamos el flujo de entrada .
  7. Como la información está en forma de Nodes, crearíamos una lista de Nodes e iteraríamos a través de cada Node usando un bucle FOR .
  8. La información específica se extraería en este ciclo y se agregaría a una lista (declarada anteriormente en el código).
  9. Con un ListAdapter , los datos se transmiten al archivo de diseño de vista de lista.

Acercarse

Para analizar un archivo XML utilizando un analizador DOM en Android, seguimos 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 information.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 information.xml . A continuación se muestra el código para el   archivo information.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user>
        <name>Steve</name>
        <designation>Apple</designation>
    </user>
    <user>
        <name>Sundar</name>
        <designation>Google</designation>
    </user>
    <user>
        <name>Jeff</name>
        <designation>Amazon</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">
  
    <!--ListView to display the list-->
    <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 name node-->
    <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 designation node-->
    <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.widget.ListAdapter
import android.widget.ListView
import android.widget.SimpleAdapter
import androidx.appcompat.app.AppCompatActivity
import org.w3c.dom.Document
import org.w3c.dom.Element
import org.w3c.dom.Node
import org.w3c.dom.NodeList
import org.xml.sax.SAXException
import java.io.IOException
import java.io.InputStream
import javax.xml.parsers.DocumentBuilder
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.ParserConfigurationException
  
open class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // Try and Catch for avoiding the application to crash
        try {
  
            // This list will contain the data from the information.xml file
            val userList: ArrayList<HashMap<String, String?>> = ArrayList()
  
            // This listView will display the data from the information.xml file
            val lv = findViewById<ListView>(R.id.user_list)
  
            // The information.xml file will be taken in the form of input stream
            val istream: InputStream = assets.open("information.xml")
  
            // Steps to convert this input stream into a list
            val builderFactory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance()
            val docBuilder: DocumentBuilder = builderFactory.newDocumentBuilder()
            val doc: Document = docBuilder.parse(istream)
            val nList: NodeList = doc.getElementsByTagName("user")
  
            // Iterating through this list
            for (i in 0 until nList.length) {
                if (nList.item(0).nodeType === Node.ELEMENT_NODE) {
                    val user: HashMap<String, String?> = HashMap()
                    val elm: Element = nList.item(i) as Element
                    user["name"] = getNodeValue("name", elm)
                    user["designation"] = getNodeValue("designation", elm)
                    userList.add(user)
                }
            }
  
            // Using Adapter to broadcast the information extracted
            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()
        }
    }
  
    // A function to get the node value while parsing
    private fun getNodeValue(tag: String?, element: Element): String? {
        val nodeList = element.getElementsByTagName(tag)
        val node = nodeList.item(0)
        if (node != null) {
            if (node.hasChildNodes()) {
                val child = node.firstChild
                while (child != null) {
                    if (child.nodeType == Node.TEXT_NODE) {
                        return child.nodeValue
                    }
                }
            }
        }
        // Returns nothing if nothing was found
        return ""
    }
}

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 *