个性化阅读
专注于IT技术分析

Kotlin Android XMLPullParser教程

本文概述

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

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

这些解析器是:

  1. DOM解析器
  2. SAX解析器
  3. XMLPullParser

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

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

XmlPullParser的事件

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

  1. START_TAG:将读取XML开始标记。
  2. 文本:已读取文本内容, 可以使用getText()方法检索文本内容。
  3. END_TAG:将读取一个结束标签。
  4. END_DOCUMENT:没有更多活动可用。

使用XMLPullParser进行XML解析的示例

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

activity_main.xml

在activity_main.xml布局中添加ListView。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.srcmini02.com.kotlinxmlparsingusingxmlpullparser.MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

    </ListView>

</android.support.constraint.ConstraintLayout>

员工.xml

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

<?xml version="1.0" encoding="UTF-8"?>
<employees>
    <employee>
        <id>1</id>
        <name>Sachin Kumar</name>
        <salary>50000</salary>
    </employee>
    <employee>
        <id>2</id>
        <name>Rahul Kumar</name>
        <salary>60000</salary>
    </employee>
    <employee>
        <id>3</id>
        <name>John Mike</name>
        <salary>70000</salary>
    </employee>
    <employee>
        <id>4</id>
        <name>Ajay Kumar</name>
        <salary>45000</salary>
    </employee>
    <employee>
        <id>5</id>
        <name>Toni Nayer</name>
        <salary>55000</salary>
    </employee>
    <employee>
        <id>6</id>
        <name>Mr Bony</name>
        <salary>42000</salary>
    </employee>
    <employee>
        <id>7</id>
        <name>Raj Kumar</name>
        <salary>30000</salary>
    </employee>
    <employee>
        <id>8</id>
        <name>Rahul Kumar</name>
        <salary>60000</salary>
    </employee>
    <employee>
        <id>9</id>
        <name>John Mike</name>
        <salary>70000</salary>
    </employee>
    <employee>
        <id>10</id>
        <name>Sachin Kumar</name>
        <salary>50000</salary>
    </employee>
    <employee>
        <id>11</id>
        <name>Rahul Kumar</name>
        <salary>60000</salary>
    </employee>
    <employee>
        <id>12</id>
        <name>John Mike</name>
        <salary>70000</salary>
    </employee>
</employees>

员工

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

package example.srcmini02.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.srcmini02.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<Employee>()
    private var employee: Employee? = null
    private var text: String? = null

    fun parse(inputStream: InputStream): List<Employee> {
        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.srcmini02.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<ListView>(R.id.listView)
        var employees: List<Employee>? = 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()
        }
    }
}

输出:

Kotlin Android XMLPullParser教程
赞(0)
未经允许不得转载:srcmini » Kotlin Android XMLPullParser教程

评论 抢沙发

评论前必须登录!