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
thanks...
ReplyDelete