📜  使用SAX Parser在Android中进行XML解析

📅  最后修改于: 2021-05-10 17:22:11             🧑  作者: Mango

通常, XML(可扩展标记语言)是一种用于交换服务器数据的常用数据交换格式。在Android中, SAX代表用于XML的简单API,并且是用于XML解析的广泛使用的API。与DOM解析器一样,SAX解析器也用于执行内存中操作来解析XML文档,但是它比DOM解析器消耗更少的内存。与DOM解析器相比,SAX解析器的主要优点是可以指示SAX解析器在文档中途停止,而不会丢失任何收集的数据。包含要提取的信息的XML文件包括以下四个主要组件:

  1. 序言: XML文件将以序言开头。 Prolog包含有关文件的信息,该信息在第一行中可用。
  2. 事件: XML文件中包含诸如文档开始和结束,标签开始和结束等事件。
  3. 文本:这是一个简单的文本,出现在开始和结束XML标签元素之间。
  4. 属性:它们是标签中存在的标签的附加属性。

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

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

我们要做什么?

  1. 我们需要一个包含一些信息的XML文件,这样我们才能制作一个。将此文件放在资产文件夹下。该文件将被调用并将被解析。
  2. 我们希望以列表的形式显示此数据以实现ListView。
  3. SAX解析器由字符审视一个XML文件的字符,和XML文件转换成一系列的事件,诸如的startElement(),的endElement()字符()的。
  4. ContentHandler对象将处理这些事件以执行适当的操作。 parse()方法会将事件发送到内容对象以对其进行处理。
  5. 在Android应用程序中创建SAXParserFactorySAXParserDefaultHandler对象的实例,以使用Android中的SAX解析器读取和解析XML数据。
  6. 使用ListAdapter ,数据被发送到ListView并在屏幕上显示出来。

方法

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

步骤1:创建一个新项目

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

步骤2:建立资产资料夹

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

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

点击项目

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

资产文件夹

然后只需单击完成按钮。

资产文件夹

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

资产文件夹

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

资产文件夹

将此信息以XML的形式粘贴,该信息将显示在userdetails.xml文件中。以下是userdetails.xml文件的代码。

XML


    
        Satya
        CTO
    
    
        Ajaypal
        CEO
    
    
        Mark
        Consultant
    


XML


  
    
    


XML


  
    
    
  
    
    
  


Kotlin
import android.os.Bundle
import android.view.View
import android.widget.ListAdapter
import android.widget.ListView
import android.widget.SimpleAdapter
import androidx.appcompat.app.AppCompatActivity
import org.xml.sax.Attributes
import org.xml.sax.SAXException
import org.xml.sax.helpers.DefaultHandler
import java.io.IOException
import java.util.*
import javax.xml.parsers.ParserConfigurationException
import javax.xml.parsers.SAXParserFactory
  
class MainActivity : AppCompatActivity() {
  
    // Create a userlist
    var userList = ArrayList>()
  
    // create a user hashmap
    var user = HashMap()
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        try {
  
            // Declare the list view from the layout file
            val lv = findViewById(R.id.user_list) as ListView
  
            // Creating and initializing an instance of SAX parser factory
            val parserFactory = SAXParserFactory.newInstance()
            val parser = parserFactory.newSAXParser()
  
            // Default handler
            val handler: DefaultHandler = object : DefaultHandler() {
                var currentValue = ""
                var currentElement = false
  
                // Start element function
                @Throws(SAXException::class)
                override fun startElement(
                    uri: String,
                    localName: String,
                    qName: String,
                    attributes: Attributes
                ) {
                    currentElement = true
                    currentValue = ""
                    if (localName == "user") {
                        user = HashMap()
                    }
                }
  
                // End element function
                @Throws(SAXException::class)
                override fun endElement(uri: String, localName: String, qName: String) {
                    currentElement = false
                    when {
                        localName.equals("name", ignoreCase = true) -> user["name"] = currentValue
                        localName.equals("designation", ignoreCase = true) -> user["designation"] = currentValue
                        localName.equals("user", ignoreCase = true) -> userList.add(user)
                    }
                }
  
                // characters function
                @Throws(SAXException::class)
                override fun characters(ch: CharArray, start: Int, length: Int) {
                    if (currentElement) {
                        currentValue += String(ch, start, length)
                    }
                }
            }
  
            // Feeding the userdetails.xml file as an Input stream
            val iStream = assets.open("userdetails.xml")
            parser.parse(iStream, handler)
  
            // Adapter to broadcast the information to the list
            val adapter: ListAdapter = SimpleAdapter(this, userList, R.layout.list,
                arrayOf("name", "designation"), intArrayOf(R.id.name, R.id.designation)
            )
            lv.adapter = adapter
        } catch (e: IOException) {
            e.printStackTrace()
        } catch (e: ParserConfigurationException) {
            e.printStackTrace()
        } catch (e: SAXException) {
            e.printStackTrace()
        }
    }
}


步骤3:使用activity_main.xml文件

现在转到代表应用程序UI的activity_main.xml文件。创建一个ListView ,如图所示。以下是activity_main.xml文件的代码

XML格式



  
    
    

步骤4:创建另一个布局文件

转到应用程序> res>布局>右键单击>新建>布局资源文件,然后将该文件命名为列表。 list.xml文件用于在ListView中显示数据。以下是list.xml文件的代码

XML格式



  
    
    
  
    
    
  

步骤5:使用MainActivity.kt文件

最后,转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。

科特林

import android.os.Bundle
import android.view.View
import android.widget.ListAdapter
import android.widget.ListView
import android.widget.SimpleAdapter
import androidx.appcompat.app.AppCompatActivity
import org.xml.sax.Attributes
import org.xml.sax.SAXException
import org.xml.sax.helpers.DefaultHandler
import java.io.IOException
import java.util.*
import javax.xml.parsers.ParserConfigurationException
import javax.xml.parsers.SAXParserFactory
  
class MainActivity : AppCompatActivity() {
  
    // Create a userlist
    var userList = ArrayList>()
  
    // create a user hashmap
    var user = HashMap()
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        try {
  
            // Declare the list view from the layout file
            val lv = findViewById(R.id.user_list) as ListView
  
            // Creating and initializing an instance of SAX parser factory
            val parserFactory = SAXParserFactory.newInstance()
            val parser = parserFactory.newSAXParser()
  
            // Default handler
            val handler: DefaultHandler = object : DefaultHandler() {
                var currentValue = ""
                var currentElement = false
  
                // Start element function
                @Throws(SAXException::class)
                override fun startElement(
                    uri: String,
                    localName: String,
                    qName: String,
                    attributes: Attributes
                ) {
                    currentElement = true
                    currentValue = ""
                    if (localName == "user") {
                        user = HashMap()
                    }
                }
  
                // End element function
                @Throws(SAXException::class)
                override fun endElement(uri: String, localName: String, qName: String) {
                    currentElement = false
                    when {
                        localName.equals("name", ignoreCase = true) -> user["name"] = currentValue
                        localName.equals("designation", ignoreCase = true) -> user["designation"] = currentValue
                        localName.equals("user", ignoreCase = true) -> userList.add(user)
                    }
                }
  
                // characters function
                @Throws(SAXException::class)
                override fun characters(ch: CharArray, start: Int, length: Int) {
                    if (currentElement) {
                        currentValue += String(ch, start, length)
                    }
                }
            }
  
            // Feeding the userdetails.xml file as an Input stream
            val iStream = assets.open("userdetails.xml")
            parser.parse(iStream, handler)
  
            // Adapter to broadcast the information to the list
            val adapter: ListAdapter = SimpleAdapter(this, userList, R.layout.list,
                arrayOf("name", "designation"), intArrayOf(R.id.name, R.id.designation)
            )
            lv.adapter = adapter
        } catch (e: IOException) {
            e.printStackTrace()
        } catch (e: ParserConfigurationException) {
            e.printStackTrace()
        } catch (e: SAXException) {
            e.printStackTrace()
        }
    }
}

输出:在模拟器上运行

输出

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