Tuesday, 20 January 2015

XML parser example using DOM and SAX Parsers


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>


1 comment:

Spinner example using AppCompatSpinner widget

          When we have a requirement to use spinner(drop down) to show list of objects in your application. Here we will see how to use Ap...