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>


how to use setonclick listener in this coding
ReplyDeleteExcellent article with a clear presentation of the main ideas. Keep sharing more informative content like this.azure devops online training
ReplyDeleteGreat article! MongoDB training online is a convenient way to learn NoSQL database concepts, CRUD operations, indexing, and aggregation pipelines. Thanks for sharing this valuable resource for beginners and aspiring developers.mongodb training online
ReplyDeleteThe explanation is simple and helpful. It is always good to find content that makes learning easier for beginners.boomi training courses
ReplyDelete