本文概述
- XmlPullParser的事件
- 使用XMLPullParser进行XML解析的示例
在android中, 存在三种类型的XML解析器来解析XML数据并在android应用程序中读取它们。
这些解析器是:
- DOM解析器
- SAX解析器
- XMLPullParser
org.xmlpull.v1.XmlPullParser接口提供使用XMLPullParser解析XML文档的功能。
XmlPullParser的事件 【Kotlin Android XMLPullParser教程】XMLPullParser的next()方法将光标指针移动到下一个事件。通常, 我们使用XMLPullParser接口中定义的四个常量(作为事件工作)。
- START_TAG:将读取XML开始标记。
- 文本:已读取文本内容, 可以使用getText()方法检索文本内容。
- END_TAG:将读取一个结束标签。
- END_DOCUMENT:没有更多活动可用。
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.srcmini.com.kotlinxmlparsingusingxmlpullparser.MainActivity">
<
ListViewandroid: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.srcmini.com.kotlinxmlparsingusingxmlpullparserclass Employee {var id: Int = 0var name: String? = nullvar salary: Float = 0.toFloat()override fun toString(): String {return " Id = $id\n Name = $name\n Salary = $salary"}}
XmlPullParserHandler.kt
编写代码以使用XMLPullParser解析XML文件。在此类中, 我们返回列表中的所有员工。
package example.srcmini.com.kotlinxmlparsingusingxmlpullparserimport org.xmlpull.v1.XmlPullParserExceptionimport org.xmlpull.v1.XmlPullParserimport org.xmlpull.v1.XmlPullParserFactoryimport java.io.IOExceptionimport java.io.InputStreamclass XmlPullParserHandler {private val employees = ArrayList<
Employee>
()private var employee: Employee? = nullprivate var text: String? = nullfun parse(inputStream: InputStream): List<
Employee>
{try {val factory = XmlPullParserFactory.newInstance()factory.isNamespaceAware = trueval parser = factory.newPullParser()parser.setInput(inputStream, null)var eventType = parser.eventTypewhile (eventType != XmlPullParser.END_DOCUMENT) {val tagname = parser.namewhen (eventType) {XmlPullParser.START_TAG ->
if (tagname.equals("employee", ignoreCase = true)) {// create a new instance of employeeemployee = Employee()}XmlPullParser.TEXT ->
text = parser.textXmlPullParser.END_TAG ->
if (tagname.equals("employee", ignoreCase = true)) {// add employee object to listemployee?.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.srcmini.com.kotlinxmlparsingusingxmlpullparserimport android.support.v7.app.AppCompatActivityimport android.os.Bundleimport android.widget.ArrayAdapterimport android.widget.ListViewimport 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注释
- 使用SAX Parser的Kotlin Android XML解析
- 使用DOM解析器的Kotlin Android XML解析
- Kotlin Android Toast
- Kotlin Android视频播放器
- Kotlin Android TextView和EditText
- Kotlin Android SQLite教程
- Kotlin Android TabLayout与FrameLayout
- 带有ViewPager的Kotlin Android TabLayout