📜  使用XmlPullParser在Android中进行XML解析

📅  最后修改于: 2021-05-10 14:18:40             🧑  作者: Mango

在android中, XMLPullParser接口提供了在android应用程序中解析XML文件的功能。与其他解析器方法(例如DOM解析器和SAX解析器)相比,XMLPullParser是一种简单高效的解析器方法,用于解析XML数据。 XMLPullParser具有next()方法,该方法提供对高级解析事件的访问。 next()方法会将解析器前进到下一个事件。以下是XMLPullParser中可用的一系列事件,这些事件将由next()方法看到。

  1. START_DOCUMENT:解析器开始处理XML文档。
  2. START_TAG:在这种情况下,我们可以获取XML的开始标签。
  3. 文本:在这种情况下,我们可以使用getText()方法读取文本内容。
  4. END_TAG:已读取结束标签。
  5. END_DOCUMENT:没有更多活动可用。

请注意,我们将使用Kotlin语言实施此项目。一个人也可以用另外两种方式执行XML解析。请参考以下文章:

  • 使用DOM解析器在Android中进行XML解析
  • 使用SAX Parser在Android中进行XML解析

我们要做什么?

XMLPullParser使用一系列事件来检查XML文件,例如START_DOCUMENT,START_TAG,TEXT,END_TAGEND_DOCUMENT,以解析XML文档。要在android中使用XMLPullParser读取和解析XML文件,需要创建XMLPullParserFactoryXMLPullParser的实例。

方法

要在Android中使用DOM解析器解析XML文件,请执行以下步骤:

步骤1:创建一个新项目

要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。

步骤2:建立资产资料夹

项目布局的主文件夹下创建一个资源文件夹。在此文件夹中创建一个Android资源文件,我们将在其中将信息以XML的形式放置。将该文件命名为userdetails.xml 。为此,请参考以下步骤:

单击“项目”,如下图左侧所示。

点击项目

展开直到找到主文件夹,右键单击它,转到“新建”>“文件夹”>“资产”文件夹

资产文件夹

然后只需单击完成按钮。

资产文件夹

现在,资产文件夹已成功创建。右键单击资产文件夹>新建> Android资源文件

资产文件夹

给它命名为Information,将类型更改为XML,然后完成。

资产文件夹

将此信息以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()
        }
    }
}

输出:在模拟器上运行

输出

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处前往由我们的专家精心策划的指南,以使您立即做好行业准备!