本文概述
XML文档通常用于在Internet上共享数据。以XML格式提供的数据能够经常更新, 并且解析它们是基于网络的应用程序的常见任务。
在android中, 存在三种类型的XML解析器来解析XML数据并在android应用程序中读取它们。
这些解析器是:
- DOM解析器
- SAX解析器
- XMLPullParser
Android建议使用XMLPullParser解析XML文件, 而不是SAX和DOM, 因为它很快。
org.xmlpull.v1.XmlPullParser接口提供使用XMLPullParser解析XML文档的功能。
XmlPullParser的事件
XMLPullParser的next()方法将光标指针移动到下一个事件。通常, 我们使用XMLPullParser接口中定义的四个常量(作为事件工作)。
- START_TAG:将读取XML开始标记。
- 文本:已读取文本内容, 可以使用getText()方法检索文本内容。
- END_TAG:将读取一个结束标签。
- 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()
}
}
}
输出:
评论前必须登录!
注册