Industrial Training




Kotlin Android XML Parsing using SAX Parser


XML document is commonly used to share the data on the internet. The data provided in the XML format are able to update frequently and parsing them is a common task for network-based apps.
In Android, there are three types of XML parsers to parse the XML data and read them in android applications, these are:


  • DOM Parser
  • SAX Parser
  • XMLPullParser

In Android, SAX (Simple API for XML) is widely used API for XML parsing. The SAX parser will examines an XML document, character by character and translates it into a series of events such as startElement(), endElement() and characters(). To read and parse the XML data using SAX parser, we need to create an instance of SAXParserFactory, SAXParser and DefaultHandler objects in android applications.


Example of XML Parsing using SAX Parser


In this example, we will parse the XML data using SAX parser and display them into ListView.


activity_main.xml


Add the ListView in the activity_main.xml layout.


< ?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.javatpoint.com.kotlinxmlparsingusingsaxparser.MainActivity">  
  
   < ListView  
        android:id="@+id/listView"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent">  
    < /ListView>  
  
< /android.support.constraint.ConstraintLayout> 

empdetail.xml


Create the XML document empdetail.xml in assets directory to parse the data using SAX parser.


< ?xml version="1.0" encoding="utf-8"?>  
< records>  
    < employee>  
        < name>Sachin Kumar< /name>  
        < salary>50000< /salary>  
        < designation>Developer< /designation>  
    < /employee>  
    < employee>  
        < name>Rahul Kumar< /name>  
        < salary>60000< /salary>  
        < designation>Team Leader< /designation>  
    < /employee>  
    < employee>  
        < name>John Mike< /name>  
        < salary>70000< /salary>  
        < designation>Manager< /designation>  
    < /employee>  
    < employee>  
        < name>Ajay Kumar< /name>  
        < salary>45000< /salary>  
        < designation>Developer< /designation>  
    < /employee>  
    < employee>  
        < name>Toni Nayer< /name>  
        < salary>55000< /salary>  
        < designation>Marketing< /designation>  
    < /employee>  
    < employee>  
        < name>Mr Bony< /name>  
        < salary>42000< /salary>  
        < designation>Sales< /designation>  
    < /employee>  
    < employee>  
        < name>Raj Kumar< /name>  
        < salary>30000< /salary>  
        < designation>Production< /designation>  
    < /employee>  
    < employee>  
        < name>Rahul Kumar< /name>  
        < salary>60000< /salary>  
        < designation>Team Leader< /designation>  
    < /employee>  
    < employee>  
        < name>John Mike< /name>  
        < salary>70000< /salary>  
        < designation>Manager< /designation>  
    < /employee>  
    < employee>  
        < name>Sachin Kumar< /name>  
        < salary>50000< /salary>  
        < designation>Developer< /designation>  
    < /employee>  
    < employee>  
        < name>Rahul Kumar< /name>  
        < salary>60000< /salary>  
        < designation>Team Leader< /designation>  
    < /employee>  
    < employee>  
        < name>John Mike< /name>  
        < salary>70000< /salary>  
        < designation>Manager< /designation>  
    < /employee>  
< /records>  

custom_list.xml


Create a custom layout to display the list of data into ListView.


< ?xml version="1.0" encoding="utf-8"?>  
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="horizontal">  
        < LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_weight="1"  
            android:orientation="vertical">  
  
            < TextView  
                android:id="@+id/name"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:text="name"  
                android:textStyle="bold"  
                android:layout_marginLeft="15dp"  
                android:layout_marginStart="15dp"  
                android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < TextView  
                android:id="@+id/salary"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:text="salary"  
                android:layout_marginLeft="15dp"  
                android:layout_marginStart="15dp"  
                android:layout_marginTop="5dp"  
                android:textSize="16sp"/>  
            < TextView  
                android:id="@+id/designation"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:text="designation"  
                android:layout_marginLeft="15dp"  
                android:layout_marginStart="15dp"  
                android:layout_marginTop="5dp"  
                android:textSize="16sp"/>  
        < /LinearLayout>  
< /LinearLayout>  

MainActivity.kt


Add the following code to read and parse the XML data using SAX parser. Create the instance of SAXParserFactory, SAXParser and DefaultHandler objects.
The HashMap< String, String> is used to read the data from XML document and add them into ArrayList().

package example.javatpoint.com.kotlinxmlparsingusingsaxparser  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
import org.xml.sax.helpers.DefaultHandler  
import javax.xml.parsers.SAXParserFactory  
import android.widget.ListView  
import android.widget.SimpleAdapter  
import org.xml.sax.SAXException  
import java.io.IOException  
import java.util.ArrayList  
import java.util.HashMap  
import javax.xml.parsers.ParserConfigurationException  
import javax.xml.parsers.SAXParser  
  
class MainActivity : AppCompatActivity() {  
    internal var empList = ArrayList< HashMap>()  
    internal var empData = HashMap< String, String>()  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_main)  
        val lv:ListView = findViewById(R.id.listView)  
        try {  
                        //instancing the SAXParserFactory class  
            val parserFactory:SAXParserFactory = SAXParserFactory.newInstance()  
            //instancing the SAXParser class  
            val saxParser:SAXParser = parserFactory.newSAXParser()  
            val defaultHandler= object : DefaultHandler() {  
                var currentValue = ""  
                var currentElement = false  
                //overriding the startElement() method of DefaultHandler  
                override fun startElement(uri: String, localName: String, qName: String, attributes: org.xml.sax.Attributes) {  
                    currentElement = true  
                    currentValue = ""  
                    if (localName == "employee") {  
                        empData = HashMap()  
                    }  
                }  
                //overriding the endElement() method of DefaultHandler  
                override fun endElement(uri: String, localName: String, qName: String) {  
                    currentElement = false  
                    if (localName.equals("name", ignoreCase = true))  
                        empData["name"] = currentValue  
                    else if (localName.equals("salary", ignoreCase = true))  
                        empData["salary"] = currentValue  
                    else if (localName.equals("designation", ignoreCase = true))  
                        empData["designation"] = currentValue  
                    else if (localName.equals("employee", ignoreCase = true))  
                        empList.add(empData)  
                }  
                //overriding the characters() method of DefaultHandler  
                override fun characters(ch: CharArray, start: Int, length: Int) {  
                    if (currentElement) {  
                        currentValue = currentValue + String(ch, start, length)  
                    }  
                }  
            }  
            val istream = assets.open("empdetail.xml")  
            saxParser.parse(istream, defaultHandler)  
            //creating Adapter class to access the custom list  
            val adapter = SimpleAdapter(this@MainActivity, empList, R.layout.custom_list, arrayOf("name", "salary", "designation"), intArrayOf(R.id.name, R.id.salary, R.id.designation))  
            lv.adapter = adapter  
        } catch (e: IOException) {  
            e.printStackTrace()  
        } catch (e: ParserConfigurationException) {  
            e.printStackTrace()  
        } catch (e: SAXException) {  
            e.printStackTrace()  
        }  
  
    }  
}  

Output:



Hi I am Pluto.