Android parse Big(3MB) KML file
For parsing big KML file I am using a SAX parser
Why Sax parser?
*Parsing data speed better.
*Dom parser can’t parse a big file.
* Json also while parsing big json file too slow and some text are missing.
*So finally I happy with SaxParser .
Screen Shot
Activity
Soure Code
This is activity class it contain user
interface of app and setting adapter to Listview
package
com.vj.parsingbigfile;
import
java.io.IOException;
import
java.util.List;
import
android.os.AsyncTask;
import
android.os.Bundle;
import
android.app.Activity;
import
android.app.Dialog;
import
android.view.Menu;
import
android.widget.ListView;
import
android.widget.ProgressBar;
/**
*
* @author
VIJAYAKUMAR M
*http://www.android-ever.com/
*/
public class
MainActivity extends Activity {
public static
List<ParsingStructure> parsingStr = null;
ListAdap listAdpter;
ListView listview
= null;
@Override
protected void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview =
(ListView)findViewById(R.id.listView1);
ParsingBigFileAsync parsingAsync = new
ParsingBigFileAsync();
parsingAsync.execute();
}
@Override
public boolean onCreateOptionsMenu(Menu
menu) {
getMenuInflater().inflate(R.menu.activity_main,
menu);
return true;
}
public class
ParsingBigFileAsync extends
AsyncTask<String, Void , String>{
String
result;
Dialog dialog;
ProgressBar pBar ;
@Override
public void
onPreExecute(){
dialog = new
Dialog(MainActivity.this);
dialog.setTitle("Loading......");
dialog.show();
}
@Override
protected
String doInBackground(String... params) {
try {
parsingStr =
SAXXMLParser.parse(getAssets().open("values.kml"));
result = "in";
} catch
(IOException e) {
e.printStackTrace();
result = "out";
}
return result;
}
@Override
public void
onPostExecute(String result){
if(result.equalsIgnoreCase("in")){
listAdpter = new
ListAdap(MainActivity.this, R.layout.listitemview, parsingStr);
listview.setAdapter(listAdpter);
dialog.dismiss();
}
}
}
}
Adapter
Class
This
is adapter class for set all values to TextView
package
com.vj.parsingbigfile;
import
java.util.List;
import
android.content.Context;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.ArrayAdapter;
import
android.widget.TextView;
/**
*
* @author
VIJAYAKUMAR M
*http://www.android-ever.com/
*/
public class
ListAdap extends
ArrayAdapter<ParsingStructure>{
Context ctx;
List<ParsingStructure> parsignStrList = null ;
public
ListAdap(Context context, int
textViewResourceId,List<ParsingStructure> parsing) {
super(context,
textViewResourceId,parsing);
ctx =
context;
parsignStrList =
parsing;
}
@Override
public View
getView(int position, View convertView, ViewGroup
parent) {
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.listitemview,
parent, false);
TextView text =
(TextView)rowView.findViewById(R.id.textView1);
try {
text.setText( parsignStrList.get(position).getName()
);
} catch
(Exception e) {
e.printStackTrace();
}
return
rowView;
}
}
ParsingStructure class
This class for creating structure for
XML values
package
com.vj.parsingbigfile;
/**
*
* @author
VIJAYAKUMAR M
* http://www.android-ever.com/
*/
public class
ParsingStructure {
private
String name;
private
String description;
private
String coordinates;
public
String getName() {
return name;
}
public void
setName(String name) {
this.name =
name;
}
public
String getDescription() {
return description;
}
public void
setDescription(String description) {
this.description =
description;
}
public
String getCoordinates() {
return coordinates;
}
public void
setCoordinates(String coordinates) {
this.coordinates =
coordinates;
if(this.name.trim().equalsIgnoreCase("Elimbah
Creek (east)"))
System.out.println(coordinates);
}
}
This
class for handling xml and setting the
value to structure class
package
com.vj.parsingbigfile;
import
java.util.ArrayList;
import
java.util.List;
import
org.xml.sax.Attributes;
import
org.xml.sax.SAXException;
import
org.xml.sax.SAXParseException;
import
org.xml.sax.helpers.DefaultHandler;
public class SAXXMLHandler extends
DefaultHandler {
private
List<ParsingStructure> parsingStructure;
private
StringBuilder tempVal;
private
ParsingStructure tempStr;
public
SAXXMLHandler() {
parsingStructure = new
ArrayList<ParsingStructure>();
}
public
List<ParsingStructure> getParsingvalues() {
return parsingStructure;
}
public void
startElement(String uri, String localName, String qName,
Attributes attributes) throws
SAXException {
tempVal = new
StringBuilder();
if
(qName.equalsIgnoreCase("Placemark")) {
tempStr = new
ParsingStructure();
}
}
public void
characters(char[] ch, int
start, int length)
throws
SAXException {
if (tempVal != null) {
for (int
i=start; i<start+length; i++) {
tempVal.append(ch[i]);
}
}
}
public void
endElement(String uri, String localName, String qName)
throws
SAXException {
if
(qName.equalsIgnoreCase("Placemark")) {
// add it to
the list
parsingStructure.add(tempStr);
} else if
(qName.equalsIgnoreCase("name")) {
if(tempStr != null)
tempStr.setName(tempVal.toString());
} else if
(qName.equalsIgnoreCase("description")) {
if(tempStr != null)
tempStr.setDescription(tempVal.toString());
} else if
(qName.equalsIgnoreCase("coordinates")) {
if(tempStr != null)
tempStr.setCoordinates(tempVal.toString());
} else if(qName.equalsIgnoreCase("kml")) {
}
}
public void
warning(SAXParseException e) throws SAXException {
}
public void
error(SAXParseException e) throws SAXException {
}
public void
fatalError(SAXParseException e) throws
SAXException {
}
}
This
class for SAX parsing(reading) from XML file .
package
com.vj.parsingbigfile;
import
java.io.InputStream;
import
java.util.List;
import
javax.xml.parsers.SAXParserFactory;
import
org.xml.sax.InputSource;
import
org.xml.sax.XMLReader;
public class
SAXXMLParser {
public static
List<ParsingStructure> parse(InputStream is) {
List<ParsingStructure> parsingStru
= null;
try {
// create a
XMLReader from SAXParser
XMLReader xmlReader =
SAXParserFactory.newInstance().newSAXParser()
.getXMLReader();
// create a
SAXXMLHandler
SAXXMLHandler saxHandler = new
SAXXMLHandler();
// store
handler in XMLReader
xmlReader.setContentHandler(saxHandler);
// the process
starts
xmlReader.parse(new
InputSource(is));
// get the
`get list`
parsingStru =
saxHandler.getParsingvalues();
} catch
(Exception ex) {
}
return
parsingStru;
}
}
Not working, How to give tags?
ReplyDelete