Android XML Parsing Tutorial - Using SAXParser


Here we are going to see about how to parse a XML using SAX Parser.
we are going to parse XML from net not from local file.

Files Used:-

XMLParsingExample.java ( Main Activity )
SitesList.java ( Getter & Setter Method )
MyXMLHandler.java ( XML Handling )
example.xml ( XML file from net )

The output will looks similar to



[sourcecode language="xml"]


AndroidPeople
www.androidpeople.com


iPhoneAppDeveloper
www.iphone-app-developer.com


[/sourcecode]
If tag names are different, then we can use string to set & get the value. But here item,name & website tags are repeating 2 times. So we can use ArrayList to store & get the data. XMLParsingExample.java This is main activity class. when App. starts this file will be called first. This file contains how to use SAX Parser to handle XML tags.

package com.androidpeople.xml.parsing;
import java.net.URL;
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.widget.LinearLayout;
import android.widget.TextView;

public class XMLParsingExample extends Activity {
/** Create Object For SiteList Class */

SitesList sitesList = null;
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

/** Create a new layout to display the view */

LinearLayout layout = new LinearLayout(this);
layout.setOrientation(1);

/** Create a new textview array to display the results */

TextView name[];
TextView website[];
TextView category[];

try {

/** Handling XML */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
/** Send URL to parse XML Tags */
URL sourceUrl = new URL(
"http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml");

/** Create handler to handle XML Tags ( extends DefaultHandler ) */

MyXMLHandler myXMLHandler = new MyXMLHandler();
xr.setContentHandler(myXMLHandler);
xr.parse(new InputSource(sourceUrl.openStream()));
} catch (Exception e) {
System.out.println("XML Pasing Excpetion = " + e);
}

/** Get result from MyXMLHandler SitlesList Object */

sitesList = MyXMLHandler.sitesList;
/** Assign textview array lenght by arraylist size */
name = new TextView[sitesList.getName().size()];
website = new TextView[sitesList.getName().size()];
category = new TextView[sitesList.getName().size()];
/** Set the result text in textview and add it to layout */
for (int i = 0; i < sitesList.getName().size(); i++) {
name[i] = new TextView(this);
name[i].setText("Name = "+sitesList.getName().get(i));
website[i] = new TextView(this);
website[i].setText("Website = "+sitesList.getWebsite().get(i));
category[i] = new TextView(this);
category[i].setText("Website Category = "+sitesList.getCategory().get(i));
layout.addView(name[i]);
layout.addView(website[i]);
layout.addView(category[i]);
}


/** Set the layout view to display */

setContentView(layout);
}
}
MyXMLHandler.java This file is used to handle the XML tags. So we need to extends with DefaultHandler. we need to override startElement, endElement & characters method . startElemnt method called when the tag starts. endElemnt method called when the tag ends characres method to get characters inside tag.
package com.androidpeople.xml.parsing;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyXMLHandler extends DefaultHandler {
Boolean currentElement = false;
String currentValue = null;
public static SitesList sitesList = null;
public static SitesList getSitesList() {
return sitesList;
}
public static void setSitesList(SitesList sitesList) {
MyXMLHandler.sitesList = sitesList;
}
/** Called when tag starts ( ex:- AndroidPeople
* --  )*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentElement = true;
if (localName.equals("maintag"))
{
/** Start */
sitesList = new SitesList();
} else if (localName.equals("website")) {
/** Get attribute value */
String attr = attributes.getValue("category");
sitesList.setCategory(attr);
}
}
/** Called when tag closing ( ex:- AndroidPeople
* --  )*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentElement = false;
/** set value */
if (localName.equalsIgnoreCase("name"))
sitesList.setName(currentValue);
else if (localName.equalsIgnoreCase("website"))
sitesList.setWebsite(currentValue);
}
/** Called to get tag characters ( ex:- AndroidPeople
* -- to get AndroidPeople Character ) */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentElement) {
currentValue = new String(ch, start, length);
currentElement = false;
}
}
}

SitesList.java

Contains Getter & Setter Method

[sourcecode language="java"]
package com.androidpeople.xml.parsing;
import java.util.ArrayList;
/** Contains getter and setter method for varialbles */
public class SitesList {
/** Variables */
private ArrayList name = new ArrayList();
private ArrayList website = new ArrayList();
private ArrayList category = new ArrayList();
/** In Setter method default it will return arraylist
* change that to add */
public ArrayList getName() {
return name;
}
public void setName(String name) {
this.name.add(name);
}
public ArrayList getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website.add(website);
}
public ArrayList getCategory() {
return category;
}
public void setCategory(String category) {
this.category.add(category);
}
}

11 comments :

Anonymous said...

how to parse a file stored in your sd card or xml file stored in your resource folder.

sk said...

how to parse the main.xml file in our android project...or file stored in our system.

Anonymous said...

for a file in the resource folder try this in the Activity,

DataHandler dataHandler = new DataHandler();
xr.setContentHandler(dataHandler);

xr.parse(new InputSource(new FileInputStream("/path/to/file.xml")));

I saw it here : http://www.jondev.net/articles/Android_XML_SAX_Parser_Example

Anonymous said...

this program is not working
giving null pointer exception.

Anonymous said...

program is giving null pointer exception. it has bug.

Anonymous said...

I actually came back to check on what you are usually
writing this time.
My web-site ... Download tv show

Anju Dahiya said...

You must provide internet permission for this. After that it is perfectly working. I run this code without any error or exception.

Unknown said...

If your xml file is in raw folder name "myxml.xml" then use this

InputStream in = this.getResources().openRawResource(R.raw.myxml);

xr.parse(new InputSource(in));

Anonymous said...

Thanks for this helpful tutorial! I included your post in my Android SAX Parser research board to share with other developers. Check it out, feel free to share. Hope other developers find this useful too. http://www.verious.com/board/Giancarlo-Leonio/building-an-android-sax-parser

Anonymous said...

Woah! I'm really enjoying the template/theme of this blog. It's simple,
yet effective. A lot of times it's tough to get that "perfect balance" between usability and visual appearance. I must say you have done a fantastic job with this. In addition, the blog loads super fast for me on Internet explorer. Excellent Blog!

Take a look at my homepage: click here

Anonymous said...

I do accept as true with all of the ideas you've presented on your post. They are really convincing and can definitely work. Nonetheless, the posts are too short for starters. Could you please extend them a little from next time? Thanks for the post.

Here is my web page Funny Video