📜  使用DOM解析器的Kotlin Android XML解析

📅  最后修改于: 2021-01-05 08:32:33             🧑  作者: Mango

使用DOM解析器的Kotlin Android XML解析

XML文档通常用于在Internet上共享数据。以XML格式提供的数据能够经常更新,并且解析它们是基于网络的应用程序的常见任务。

在Android中,有三种类型的XML解析器可以解析XML数据并在android应用程序中读取它们,它们是:

Android DOM(文档对象模型)解析器使用基于对象的方法来创建和解析android应用程序中的XML文件。 DOM解析器将XML文件加载到内存中以解析XML文档。由于这个原因,它消耗更多的内存。

使用DOM解析器进行XML解析的示例

在此示例中,我们解析XML数据并将其显示在ListView中。

activity_main.xml

在activity_main.xml布局中添加ListView。




    
     

empdetail.xml

在资产目录中创建XML文档empdetail.xml,以使用DOM解析器解析数据。



    
        Sachin Kumar
        50000
        Developer
    
    
        Rahul Kumar
        60000
        Team Leader
    
    
        John Mike
        70000
        Manager
    
    
        Ajay Kumar
        45000
        Developer
    
    
        Toni Nayer
        55000
        Marketing
    
    
        Mr Bony
        42000
        Sales
    
    
        Raj Kumar
        30000
        Production
    
    
        Rahul Kumar
        60000
        Team Leader
    
    
        John Mike
        70000
        Manager
    
    
        Sachin Kumar
        50000
        Developer
    
    
        Rahul Kumar
        60000
        Team Leader
    
    
        John Mike
        70000
        Manager
    

custom_list.xml

创建一个自定义布局以将数据列表显示到ListView中。



    

        

        
        
    

MainActivity.kt

添加以下代码以使用DOM解析器读取和解析XML数据。创建DocumentBuilderFactory,DocumentBuilderDocument对象的实例。

HashMap 用于从XML文档读取数据并将其添加到ArrayList()中。

package example.javatpoint.com.kotlinxmlparsingusingdomparser

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ListView
import android.widget.SimpleAdapter
import org.w3c.dom.Element
import org.w3c.dom.Node
import org.xml.sax.SAXException
import java.io.IOException
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.ParserConfigurationException

class MainActivity : AppCompatActivity() {
    var empDataHashMap = HashMap()
    var empList: ArrayList> = ArrayList()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        try {
            val lv = findViewById(R.id.listView)
            val istream = assets.open("empdetail.xml")
            val builderFactory = DocumentBuilderFactory.newInstance()
            val docBuilder = builderFactory.newDocumentBuilder()
            val doc = docBuilder.parse(istream)
        //reading the tag "employee" of empdetail file
            val nList = doc.getElementsByTagName("employee")
            for (i in 0 until nList.getLength()) {
                if (nList.item(0).getNodeType().equals(Node.ELEMENT_NODE) ) {
                  //creating instance of HashMap to put the data of node value         
           empDataHashMap = HashMap()
                    val element = nList.item(i) as Element
                    empDataHashMap.put("name", getNodeValue("name", element))
                    empDataHashMap.put("salary", getNodeValue("salary", element))
                    empDataHashMap.put("designation", getNodeValue("designation", element))
          //adding the HashMap data to ArrayList
                    empList.add(empDataHashMap)
                }
            }
            val adapter = SimpleAdapter(this@MainActivity, empList, R.layout.custom_list, arrayOf("name", "salary", "designation"), intArrayOf(R.id.name, R.id.salary, R.id.designation))
            lv.setAdapter(adapter)
        } catch (e: IOException) {
            e.printStackTrace()
        } catch (e: ParserConfigurationException) {
            e.printStackTrace()
        } catch (e: SAXException) {
            e.printStackTrace()
        }

    }
    // function to return node value
    protected 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.getFirstChild()
                while (child != null) {
                    if (child.getNodeType() === Node.TEXT_NODE) {
                        return child.getNodeValue()
                    }
                }
            }
        }
        return ""
    }
}

输出: