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>


4 comments:

  1. how to use setonclick listener in this coding

    ReplyDelete
  2. Excellent article with a clear presentation of the main ideas. Keep sharing more informative content like this.azure devops online training

    ReplyDelete
  3. Great 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

    ReplyDelete
  4. The explanation is simple and helpful. It is always good to find content that makes learning easier for beginners.boomi training courses

    ReplyDelete

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...