📜  Kotlin Android XMLPullParser教程

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

Kotlin Android XMLPullParser教程

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

在android中,存在三种类型的XML解析器来解析XML数据并在android应用程序中读取它们。

这些解析器是:

Android建议使用XMLPullParser解析XML文件,而不是SAX和DOM,因为它很快。

org.xmlpull.v1.XmlPullParser接口提供使用XMLPullParser解析XML文档的功能。

XmlPullParser的事件

XMLPullParsernext()方法将光标指针移动到下一个事件。通常,我们使用XMLPullParser接口中定义的四个常量(作为事件工作)。

  • START_TAG :将读取XML开始标记。
  • TEXT :已读取文本内容,可以使用getText()方法检索文本内容。
  • END_TAG :将读取结束标签。
  • END_DOCUMENT :没有更多可用的事件。

使用XMLPullParser进行XML解析的示例

在此示例中,我们读取XML数据并将其使用XMLPullParser绑定到ListView中。

activity_main.xml

在activity_main.xml布局中添加ListView。




    

    


员工.xml

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



    
        1
        Sachin Kumar
        50000
    
    
        2
        Rahul Kumar
        60000
    
    
        3
        John Mike
        70000
    
    
        4
        Ajay Kumar
        45000
    
    
        5
        Toni Nayer
        55000
    
    
        6
        Mr Bony
        42000
    
    
        7
        Raj Kumar
        30000
    
    
        8
        Rahul Kumar
        60000
    
    
        9
        John Mike
        70000
    
    
        10
        Sachin Kumar
        50000
    
    
        11
        Rahul Kumar
        60000
    
    
        12
        John Mike
        70000
    

员工

创建一个与XML数据文件相对应的数据模型类Employee.kt。

package example.javatpoint.com.kotlinxmlparsingusingxmlpullparser

class Employee {
    var id: Int = 0
    var name: String? = null
    var salary: Float = 0.toFloat()

    override fun toString(): String {
        return " Id = $id\n Name = $name\n Salary = $salary"
    }
}

XmlPullParserHandler.kt

编写代码以使用XMLPullParser解析XML文件。在此类中,我们返回列表中的所有员工。

package example.javatpoint.com.kotlinxmlparsingusingxmlpullparser

import org.xmlpull.v1.XmlPullParserException
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserFactory
import java.io.IOException
import java.io.InputStream

class XmlPullParserHandler {
    private val employees = ArrayList()
    private var employee: Employee? = null
    private var text: String? = null

    fun parse(inputStream: InputStream): List {
        try {
            val factory = XmlPullParserFactory.newInstance()
            factory.isNamespaceAware = true
            val parser = factory.newPullParser()
            parser.setInput(inputStream, null)
            var eventType = parser.eventType
            while (eventType != XmlPullParser.END_DOCUMENT) {
                val tagname = parser.name
                when (eventType) {
                    XmlPullParser.START_TAG -> if (tagname.equals("employee", ignoreCase = true)) {
                        // create a new instance of employee
                        employee = Employee()
                    }
                    XmlPullParser.TEXT -> text = parser.text
                    XmlPullParser.END_TAG -> if (tagname.equals("employee", ignoreCase = true)) {
                        // add employee object to list
                        employee?.let { employees.add(it) }
                    } else if (tagname.equals("id", ignoreCase = true)) {
                        employee!!.id = Integer.parseInt(text)
                    } else if (tagname.equals("name", ignoreCase = true)) {
                        employee!!.name = text
                    } else if (tagname.equals("salary", ignoreCase = true)) {
                        employee!!.salary = java.lang.Float.parseFloat(text)
                    }

                    else -> {
                    }
                }
                eventType = parser.next()
            }

        } catch (e: XmlPullParserException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return employees
    }
}

MainActivity.kt

在此类中,我们将XML数据发送到ArrayAdapter并将其绑定到ListView。

package example.javatpoint.com.kotlinxmlparsingusingxmlpullparser

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import java.io.IOException 


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState) 
        setContentView(R.layout.activity_main)
        val listView = findViewById(R.id.listView)
        var employees: List? = null 
        try {
            val parser = XmlPullParserHandler()
            val istream = assets.open("employees.xml")
            employees = parser.parse(istream)

            val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, employees)
            listView.adapter = adapter

        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

输出: