Android parse XML file example using SAX Parser

Here we are going to see about how to parse a XML using SAX Parser. SAX parser is fast and has less memory footprint. First we need to create an instance of SAXParserFactory and then use a custom XML handler extending DefaultHandler that will map our XML file into a java bean.



Sample XML data used in this example

<Items>
    <ItemData>
        <ItemNumber>ABC</ItemNumber>
        <Description>ABC Item Description</Description>
        <Price>9.95</Price>
        <Weight>10.00</Weight>
    </ItemData>
    <ItemData>
        <ItemNumber>XYZ</ItemNumber>
        <Description>XYZ Item Description</Description>
        <Price>19.95</Price>
        <Weight>22.22</Weight>
    </ItemData>
</Items>

Source code for ItemMaster.java

package com.as400samplecode;

public class ItemMaster {
   
    String itemNumber = null;
    String description = null;
    String price = null;
    double weight = 0;
   
    public String getItemNumber() {
        return itemNumber;
    }
    public void setItemNumber(String itemNumber) {
        this.itemNumber = itemNumber;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
   
}

Source code for ItemXMLHandler.java

package com.as400samplecode;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ItemXMLHandler extends DefaultHandler {

    Boolean currentElement = false;
    String currentValue = "";
    ItemMaster item = null;
    private ArrayList<ItemMaster> itemsList = new ArrayList<ItemMaster>();

    public ArrayList<ItemMaster> getItemsList() {
        return itemsList;
    }

    // Called when tag starts 
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        currentElement = true;
        currentValue = "";
        if (localName.equals("ItemData")) {
            item = new ItemMaster();
        } 

    }

    // Called when tag closing 
    @Override
    public void endElement(String uri, String localName, String qName)
    throws SAXException {

        currentElement = false;

        /** set value */
        if (localName.equalsIgnoreCase("ItemNumber"))
            item.setItemNumber(currentValue);
        else if (localName.equalsIgnoreCase("Description"))
            item.setDescription(currentValue);
        else if (localName.equalsIgnoreCase("Price"))
            item.setPrice(currentValue);
        else if (localName.equalsIgnoreCase("Weight"))
            item.setWeight(Double.parseDouble(currentValue));
        else if (localName.equalsIgnoreCase("ItemData"))
            itemsList.add(item);
    }

    // Called to get tag characters 
    @Override
    public void characters(char[] ch, int start, int length)
    throws SAXException {

        if (currentElement) {
            currentValue = currentValue +  new String(ch, start, length);
        }

    }

}

Source code for AndroidParseXMLActivity.java

package com.as400samplecode;

import java.io.StringReader;
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidParseXMLActivity extends Activity {

    private EditText xmlInput;
    private TextView xmlOutput;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        xmlInput = (EditText) findViewById(R.id.xmlInput);
        xmlOutput = (TextView) findViewById(R.id.xmlOutput);

        Button parseMyXML = (Button) findViewById(R.id.parse);
        parseMyXML.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                parseXML();
            }
        });
    }

    private void parseXML() {

        String parsedData = "";
       
        try {

            Log.w("AndroidParseXMLActivity", "Start");
            /** Handling XML */
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            ItemXMLHandler myXMLHandler = new ItemXMLHandler();
            xr.setContentHandler(myXMLHandler);
            InputSource inStream = new InputSource();
            Log.w("AndroidParseXMLActivity", "Parse1");

            inStream.setCharacterStream(new StringReader(xmlInput.getText().toString()));
            Log.w("AndroidParseXMLActivity", "Parse2");

            xr.parse(inStream);
            Log.w("AndroidParseXMLActivity", "Parse3");

            ArrayList<ItemMaster> itemsList = myXMLHandler.getItemsList();
            for(int i=0;i<itemsList.size();i++){
                ItemMaster item = itemsList.get(i);
                parsedData = parsedData + "----->\n";
                parsedData = parsedData + "Item Number: " + item.getItemNumber() + "\n";
                parsedData = parsedData + "Description: " + item.getDescription() + "\n";
                parsedData = parsedData + "Price: " + item.getPrice() + "\n";
                parsedData = parsedData + "Weight: "+ item.getWeight() + "\n";
               
            }
            Log.w("AndroidParseXMLActivity", "Done");
        }
        catch (Exception e) {
            Log.w("AndroidParseXMLActivity",e );
        }
       
        xmlOutput.setText(parsedData);
       
    }

}

Source code for main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="@string/hello"
        android:textStyle="bold" android:textSize="25sp"
        android:paddingBottom="15dp" />
    <EditText android:layout_height="wrap_content"
        android:layout_width="match_parent" android:id="@+id/xmlInput"
        android:lines="10">
        <requestFocus />
    </EditText>
    <Button android:layout_height="wrap_content"
        android:layout_width="wrap_content" android:id="@+id/parse"
        android:text="Parse Now" />
    <TextView android:layout_height="wrap_content"
        android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textView1" android:text="Parsed XML Data"
        android:paddingBottom="15dp" android:textStyle="bold" />
    <ScrollView android:layout_height="wrap_content"
        android:layout_width="match_parent" android:id="@+id/scrollView1">
        <LinearLayout android:id="@+id/linearLayout1"
            android:layout_width="match_parent" android:layout_height="match_parent">
            <TextView android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:id="@+id/xmlOutput" android:layout_width="match_parent" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

Recommended Reading