在android中, XMLPullParser接口提供了在android应用程序中解析XML文件的功能。与其他解析器方法(例如DOM解析器和SAX解析器)相比,XMLPullParser是一种简单高效的解析器方法,用于解析XML数据。 XMLPullParser具有next()方法,该方法提供对高级解析事件的访问。 next()方法会将解析器前进到下一个事件。以下是XMLPullParser中可用的一系列事件,这些事件将由next()方法看到。
- START_DOCUMENT:解析器开始处理XML文档。
- START_TAG:在这种情况下,我们可以获取XML的开始标签。
- 文本:在这种情况下,我们可以使用getText()方法读取文本内容。
- END_TAG:已读取结束标签。
- END_DOCUMENT:没有更多活动可用。
请注意,我们将使用Kotlin语言实施此项目。一个人也可以用另外两种方式执行XML解析。请参考以下文章:
- 使用DOM解析器在Android中进行XML解析
- 使用SAX Parser在Android中进行XML解析
我们要做什么?
XMLPullParser使用一系列事件来检查XML文件,例如START_DOCUMENT,START_TAG,TEXT,END_TAG和END_DOCUMENT,以解析XML文档。要在android中使用XMLPullParser读取和解析XML文件,需要创建XMLPullParserFactory和XMLPullParser的实例。
方法
要在Android中使用DOM解析器解析XML文件,请执行以下步骤:
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。
步骤2:建立资产资料夹
在项目布局的主文件夹下创建一个资源文件夹。在此文件夹中创建一个Android资源文件,我们将在其中将信息以XML的形式放置。将该文件命名为userdetails.xml 。为此,请参考以下步骤:
单击“项目”,如下图左侧所示。
展开直到找到主文件夹,右键单击它,转到“新建”>“文件夹”>“资产”文件夹
然后只需单击完成按钮。
现在,资产文件夹已成功创建。右键单击资产文件夹>新建> Android资源文件
给它命名为Information,将类型更改为XML,然后完成。
Note: Sometimes, right-clicking on the Assets folder and creating an Android Resource File creates a file in the res folder. If this happens, cut our file and paste it directly into the assets folder. This happens due to some internal settings.
将此信息以XML的形式粘贴,该信息将显示在userdetails.xml文件中。以下是userdetails.xml文件的代码。
XML
Tom
Actor and Producer
Danny
Music Director
Christopher
Writer
XML
XML
Kotlin
import android.os.Bundle
import android.widget.ListAdapter
import android.widget.ListView
import android.widget.SimpleAdapter
import androidx.appcompat.app.AppCompatActivity
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserException
import org.xmlpull.v1.XmlPullParserFactory
import java.io.IOException
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
// creating a user list string hash map arraylist
val userList = ArrayList>()
// creating a user string hashmap
var user = HashMap()
// declaring the list view from the layout file
val lv = findViewById(R.id.user_list)
// input stream the userdetails.xml file
val istream = assets.open("userdetails.xml")
//creating a XmlPull parse Factory instance
val parserFactory = XmlPullParserFactory.newInstance()
val parser = parserFactory.newPullParser()
// setting the namespaces feature to false
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
// setting the input to the parser
parser.setInput(istream, null)
// working with the input stream
var tag: String? = ""
var text: String? = ""
var event = parser.eventType
while (event != XmlPullParser.END_DOCUMENT) {
tag = parser.name
when (event) {
XmlPullParser.START_TAG -> if (tag == "user") user = HashMap()
XmlPullParser.TEXT -> text = parser.text
XmlPullParser.END_TAG -> when (tag) {
"name" -> user["name"] = text
"designation" -> user["designation"] = text
"user" -> userList.add(user)
}
}
event = parser.next()
}
// List Adapter to broadcast the information to the list_rows.xml file
val adapter: ListAdapter = SimpleAdapter(this, userList, R.layout.list_row,
arrayOf("name", "designation"), intArrayOf(R.id.name, R.id.designation)
)
lv.adapter = adapter
} catch (e: IOException) {
e.printStackTrace()
} catch (e: XmlPullParserException) {
e.printStackTrace()
}
}
}
步骤3:使用activity_main.xml文件
现在转到代表应用程序UI的activity_main.xml文件。创建一个ListView ,如图所示。以下是activity_main.xml文件的代码。
XML格式
步骤4:创建另一个布局文件
转到应用程序> res>布局>右键单击>新建>布局资源文件,并将文件命名为list_row。 list_row.xml文件用于在ListView中显示数据。下面是list_row.xml文件的代码。
XML格式
步骤5:使用MainActivity.kt文件
最后,转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。
科特林
import android.os.Bundle
import android.widget.ListAdapter
import android.widget.ListView
import android.widget.SimpleAdapter
import androidx.appcompat.app.AppCompatActivity
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserException
import org.xmlpull.v1.XmlPullParserFactory
import java.io.IOException
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
// creating a user list string hash map arraylist
val userList = ArrayList>()
// creating a user string hashmap
var user = HashMap()
// declaring the list view from the layout file
val lv = findViewById(R.id.user_list)
// input stream the userdetails.xml file
val istream = assets.open("userdetails.xml")
//creating a XmlPull parse Factory instance
val parserFactory = XmlPullParserFactory.newInstance()
val parser = parserFactory.newPullParser()
// setting the namespaces feature to false
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
// setting the input to the parser
parser.setInput(istream, null)
// working with the input stream
var tag: String? = ""
var text: String? = ""
var event = parser.eventType
while (event != XmlPullParser.END_DOCUMENT) {
tag = parser.name
when (event) {
XmlPullParser.START_TAG -> if (tag == "user") user = HashMap()
XmlPullParser.TEXT -> text = parser.text
XmlPullParser.END_TAG -> when (tag) {
"name" -> user["name"] = text
"designation" -> user["designation"] = text
"user" -> userList.add(user)
}
}
event = parser.next()
}
// List Adapter to broadcast the information to the list_rows.xml file
val adapter: ListAdapter = SimpleAdapter(this, userList, R.layout.list_row,
arrayOf("name", "designation"), intArrayOf(R.id.name, R.id.designation)
)
lv.adapter = adapter
} catch (e: IOException) {
e.printStackTrace()
} catch (e: XmlPullParserException) {
e.printStackTrace()
}
}
}