Friday, February 1, 2013

Android parse XML file example using SAX Parser from Asset

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.



Source code for MainActivity.java


package com.jiteshandroidsaxparser;

import java.io.FileInputStream;
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;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

private TextView xmlOutput;

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

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);

Log.w("AndroidParseXMLActivity", "Parse1");

Log.w("AndroidParseXMLActivity", "Parse2");

xr.parse(new InputSource(getAssets().open("data.txt")));
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:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="15dp"
        android:text="@string/hello_world" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="15dp"
        android:text="@string/xmldata" />

    <Button
        android:id="@+id/parse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Parse Now" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="15dp"
        android:text="Parsed XML Data"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <TextView
                android:id="@+id/xmlOutput"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

Source code for ItemXMLHandler.java


package com.jiteshandroidsaxparser;

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 ItemMaster.java


package com.jiteshandroidsaxparser;


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;
   }
   
}

Sample XML data used in this example from Asset folder as data.txt


<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 res/values/strings.xml


<resources>

    <string name="app_name">AndroidSAXParser</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">MainActivity</string>
    <string name="xmldata">parsing input text file is at asset folder</string>

</resources>

you can get the source code from SAX PARSER

1 comment: