📜  使用DOM解析器在Android中进行XML解析

📅  最后修改于: 2021-05-13 15:58:27             🧑  作者: Mango

Android DOM(文档对象模型)解析器是解析XML文档并从中提取所需信息的程序。该解析器使用基于对象的方法来创建和解析XML文件。通常,DOM解析器会将XML文件加载到Android内存中以解析XML文档。这导致更多的内存消耗。该文档通过XML文件中的每个可能的节点进行解析。包含要提取的信息的XML文件包括以下四个主要组件:

  1. 序言: XML文件将以序言开头。 Prolog包含有关文件的信息,该信息在第一行中可用。
  2. 事件: XML文件中包含诸如文档开始和结束,标签开始和结束等事件。
  3. 文本:这是一个简单的文本,出现在开始和结束XML标签元素之间。
  4. 属性:它们是标签中存在的标签的附加属性。

请注意,我们将使用Kotlin语言实施此项目。一个人也可以用另外两种方式执行XML解析。请参考以下文章:

  • 使用SAX Parser在Android中进行XML解析
  • 使用XmlPullParser在Android中进行XML解析

我们要做什么?

  1. 我们需要一个包含一些信息的XML文件,这样我们才能制作一个。将此文件放在资产文件夹下。该文件将被调用并将被解析。
  2. 我们希望以列表的形式显示此数据以实现列表视图。
  3. 在Main程序中,我们从资产文件夹调用了信息文件(在资产文件夹下),并将其作为输入流提供。
  4. 使用DocumentBuilderFactory ,我们将创建一个新实例。
  5. 使用DocumentBuilder ,我们生成一个新的文档构建器。
  6. 使用Document方法,我们分析输入流
  7. 由于信息是节点形式的,因此我们将创建一个NodeList并使用FOR循环遍历每个节点。
  8. 在此循环中将提取特定信息,并将其添加到列表中(在代码的前面已声明)。
  9. 使用ListAdapter ,数据被广播到列表视图布局文件中。

方法

要在Android中使用DOM解析器解析XML文件,请执行以下步骤:

步骤1:创建一个新项目

要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。

步骤2:建立资产资料夹

项目布局的主文件夹下创建一个资源文件夹。在此文件夹中创建一个Android资源文件,我们将在其中将信息以XML的形式放置。将该文件命名为information.xml 。为此,请参考以下步骤:

单击“项目”,如下图左侧所示。

点击项目

展开直到找到主文件夹,右键单击它,转到“新建”>“文件夹”>“资产”文件夹

资产文件夹

然后只需单击完成按钮。

资产文件夹

现在,资产文件夹已成功创建。右键单击资产文件夹>新建> Android资源文件

资产文件夹

给它命名为Information,将类型更改为XML,然后完成。

资产文件夹

以XML形式粘贴此信息,该信息将显示在information.xml文件中。以下是information.xml文件的代码。

XML


    
        Steve
        Apple
    
    
        Sundar
        Google
    
    
        Jeff
        Amazon
    


XML


  
    
    


XML


  
    
    
  
    
    
      


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> = ArrayList()
  
            // This listView will display the data from the information.xml file
            val lv = findViewById(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 = 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 ""
    }
}


步骤3:使用activity_main.xml文件

现在转到代表应用程序UI的activity_main.xml文件。创建一个ListView ,如图所示。以下是activity_main.xml文件的代码。

XML格式



  
    
    

步骤4:创建另一个布局文件

转到应用程序> res>布局>右键单击>新建>布局资源文件,然后将该文件命名为列表。 list.xml文件用于在ListView中显示数据。以下是list.xml文件的代码。

XML格式



  
    
    
  
    
    
      

步骤5:使用MainActivity.kt文件

最后,转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。

科特林

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> = ArrayList()
  
            // This listView will display the data from the information.xml file
            val lv = findViewById(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 = 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 ""
    }
}

输出:在模拟器上运行

输出

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处前往由我们的专家精心策划的指南,以使您立即做好行业准备!