Note: This application is done in Android Studio tool.
Screen Shots of this example
Download Sample Code
xml file look like this
<CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> <CD> <TITLE>Hide your heart</TITLE> <ARTIST>Bonnie Tylor</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>CBS Records</COMPANY> <PRICE>9.90</PRICE> <YEAR>1988</YEAR> </CD> <CD> <TITLE>Greatest Hits</TITLE> <ARTIST>Dolly Parton</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>RCA</COMPANY> <PRICE>9.90</PRICE> <YEAR>1982</YEAR> </CD> <CD> <TITLE>Still got the blues</TITLE> <ARTIST>Gary More</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Virgin redords</COMPANY> <PRICE>10.20</PRICE> <YEAR>1990</YEAR> </CD> </CATALOG>
Step 1:
open activity_main.xml and copy below code.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:padding="20dp" android:text="DOM Parser" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignTop="@+id/button" android:padding="20dp" android:text="SAX Parser" /> <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/button" /> </RelativeLayout>
Step 2:
create list_row.xml file in layout folder then copy below code.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8dp"> <!-- Movie Title --> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Title" android:textStyle="bold" /> <TextView android:id="@+id/artist" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/title" android:layout_marginTop="1dip" android:text="artist" /> <TextView android:id="@+id/company" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/artist" android:layout_marginTop="5dp" android:text="Company" /> <TextView android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="Price" /> <TextView android:id="@+id/releaseYear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@id/price" android:text="year" /> </RelativeLayout>
Step 3:
open MainActivity.java and copy below code.
package com.infodat.xmlparserexample; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ListView; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class MainActivity extends ActionBarActivity { Button domParserButton, saxParserButton; private ListView listView; List<Movie> movie_list; ProgressDialog waitProgress; private boolean isDomParser = false; private CustomListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initControls(); } private void initControls() { domParserButton = (Button) findViewById(R.id.button); saxParserButton = (Button) findViewById(R.id.button2); listView=(ListView) findViewById(R.id.listView); domParserButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isDomParser = true; new BackgroundTask().execute(); } }); saxParserButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isDomParser = false; new BackgroundTask().execute(); } }); } public class BackgroundTask extends AsyncTask<Void, Integer, Void> { @Override protected void onPreExecute() { super.onPreExecute(); waitProgress = ProgressDialog.show(MainActivity.this, "", "Loading please wait..."); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (waitProgress != null) { waitProgress.dismiss(); } } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); displayData(); if (waitProgress != null) { waitProgress.dismiss(); } } @Override protected Void doInBackground(Void... params) { try { synchronized (this) { if (isDomParser) domParser(); else saxParser(); publishProgress(25); } } catch (Exception e) { e.printStackTrace(); } return null; } } private void domParser() { try { movie_list = new ArrayList<Movie>(); String url = "http://www.xmlfiles.com/examples/cd_catalog.xml"; DomXmlParser domParser = new DomXmlParser(); Document document = domParser.getDocument(url); document.getDocumentElement().normalize(); NodeList nodelist = document.getElementsByTagName("CD"); // Log.i("DomParser", "nodelist: " + nodelist.getLength()); for (int i = 0; i < nodelist.getLength(); i++) { Node node = nodelist.item(i); Movie movie = new Movie(); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String title = domParser.getValue(element, "TITLE"); String artist = domParser.getValue(element, "ARTIST"); String country = domParser.getValue(element, "COUNTRY"); String company = domParser.getValue(element, "COMPANY"); String price = domParser.getValue(element, "PRICE"); String year = domParser.getValue(element, "YEAR"); movie.setTitle(title); movie.setArtist(artist); movie.setCountry(country); movie.setCompany(company); movie.setPrice(price); movie.setYear(year); movie_list.add(movie); } // Log.i("DomParser", "movieList: " + movie_list.size()); } } catch (Exception e) { e.printStackTrace(); } } private void saxParser() { try { movie_list = new ArrayList<Movie>(); /** * Create a new instance of the SAX parser **/ SAXParserFactory saxPF = SAXParserFactory.newInstance(); SAXParser saxP = saxPF.newSAXParser(); XMLReader xmlR = saxP.getXMLReader(); URL url = new URL("http://www.xmlfiles.com/examples/cd_catalog.xml"); /** * Create the Handler to handle each of the XML tags. **/ SaxXmlHandler myXMLHandler = new SaxXmlHandler(); xmlR.setContentHandler(myXMLHandler); xmlR.parse(new InputSource(url.openStream())); movie_list = myXMLHandler.getMovieList(); // Log.i("SaxParser", "size: " + movie_list.size()); } catch (Exception e) { System.out.println(e); } } private void displayData(){ adapter = new CustomListAdapter(this, movie_list); adapter.notifyDataSetChanged(); listView.setAdapter(adapter); } }
Step 4:
create DomXmlParser.java then copy below code.
package com.infodat.xmlparserexample; import android.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URL; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; public class DomXmlParser { public DomXmlParser() { } public Document getDocument(String url) { Document document = null; try { URL dataUrl = new URL(url); DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); document = db.parse(new InputSource(dataUrl.openStream())); } catch (Exception e) { e.printStackTrace(); } return document; } /* * Getting node value * @param Element node * @param key string * */ public String getValue(Element element, String str) { NodeList nlList = element.getElementsByTagName(str).item(0) .getChildNodes(); Node nValue = (Node) nlList.item(0); return nValue.getNodeValue(); } }
Step 5:
create SaxXmlHandler.java file then copy below code.
package com.infodat.xmlparserexample; import android.util.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.util.ArrayList; import java.util.List; public class SaxXmlHandler extends DefaultHandler { private List<Movie> movieList; private Movie movie; private String tempVal; public SaxXmlHandler() { movieList = new ArrayList<Movie>(); } public List<Movie> getMovieList() { return movieList; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); tempVal = ""; if (qName.equalsIgnoreCase("CD")) { // create a new instance of Movie movie = new Movie(); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if (qName.equalsIgnoreCase("CD")) { // add it to the list movieList.add(movie); } else if (qName.equalsIgnoreCase("TITLE")) { movie.setTitle(tempVal); } else if (qName.equalsIgnoreCase("ARTIST")) { movie.setArtist(tempVal); } else if (qName.equalsIgnoreCase("COUNTRY")) { movie.setCountry(tempVal); } else if (qName.equalsIgnoreCase("COMPANY")) { movie.setCompany(tempVal); } else if (qName.equalsIgnoreCase("PRICE")) { movie.setPrice(tempVal); }else if (qName.equalsIgnoreCase("YEAR")) { movie.setYear(tempVal); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); tempVal = new String(ch, start, length); Log.i("String", "charvalue: " + tempVal); } }
Step 6:
create Movie.java file and copy below code.
package com.infodat.xmlparserexample; public class Movie { private String title; private String artist; private String country; private String company; private String price; private String year; public void setTitle(String title) { this.title = title; } public void setArtist(String artist) { this.artist = artist; } public void setCountry(String country) { this.country = country; } public void setCompany(String company) { this.company = company; } public void setPrice(String price) { this.price = price; } public Movie() { } public void setYear(String year) { this.year = year; } public String getTitle() { return title; } public String getArtist() { return artist; } public String getCountry() { return country; } public String getCompany() { return company; } public String getPrice() { return price; } public String getYear() { return year; } }
Step 7:
create CustomListAdapter.java file and copy below code.
package com.infodat.xmlparserexample; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.List; public class CustomListAdapter extends BaseAdapter { List<Movie> movie_list; Activity activity; public CustomListAdapter(Activity activity, List<Movie> movie_list) { this.activity = activity; this.movie_list = movie_list; } @Override public int getCount() { return movie_list.size(); } @Override public Object getItem(int position) { return movie_list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = activity.getLayoutInflater(); if (convertView == null) convertView = inflater.inflate(R.layout.list_row, null); TextView titleView = (TextView) convertView.findViewById(R.id.title); TextView artistView = (TextView) convertView.findViewById(R.id.artist); TextView companyView = (TextView) convertView.findViewById(R.id.company); TextView priceView = (TextView) convertView.findViewById(R.id.price); TextView yearView = (TextView) convertView.findViewById(R.id.releaseYear); Movie movie = movie_list.get(position); titleView.setText("Title: " + movie.getTitle() + ", " + movie.getCountry()); artistView.setText("Artist: " + movie.getArtist()); companyView.setText("Company: " + movie.getCompany()); priceView.setText("Price: " + movie.getPrice()); yearView.setText("Year: " + movie.getYear()); return convertView; } }
Step 8:
open AndroidManifest.xml file and modify below code.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.infodat.xmlparserexample" > <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>