0

I am new to this platform and i've been stuck at this error for sometime i've searched for this error online but non of the answers seem to satisfy my case. I am trying to extract data using XmlPullparser on Android and adding the extracted data to an arraylist of type model('model' object that i defined). The XmlPullparser is parsing the document correctly as i tried to store the data in an arraylist of type String and it worked. The issue comes about when i store to the former and the following error arises

  java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.newsmodel.model.getTitles()' on a null object reference
        at com.example.newsmodel.MainActivity$GetStoriesInBackground.onPostExecute(MainActivity.java:121)
        at com.example.newsmodel.MainActivity$GetStoriesInBackground.onPostExecute(MainActivity.java:49)
        at android.os.AsyncTask.finish(AsyncTask.java:755)
        at android.os.AsyncTask.access$900(AsyncTask.java:192)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
        at android.os.Handler.dispatchMessage(Handler.java:107)

Here's the code for parsing the Xml document:


import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    TextView tvtitle;
    TextView tvDescription;
    ArrayList<String> titles;
    ArrayList<String> descriptions;
    ArrayList<model> items;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvtitle = (TextView) findViewById(R.id.tvTitle);
        tvDescription = (TextView) findViewById(R.id.tvDescription);
        titles = new ArrayList<>();
        descriptions = new ArrayList<>();
        items = new ArrayList<model>();
        new GetStoriesInBackground().execute();
    }
    private InputStream getInputStream(URL url) {
        try {
            return url.openConnection().getInputStream();
        } catch (IOException e) {
            return null;
        }
    }


    @SuppressLint("StaticFieldLeak")
    public class GetStoriesInBackground extends AsyncTask<Void, Void, String>
    {

        @Override
        protected String doInBackground(Void... params) {

            try {

                URL url = new URL("https://www.businessdailyafrica.com/539444-539444-view-asFeed-bfdflfz/index.xml");

                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(false);
                XmlPullParser xpp = factory.newPullParser();

                // get the XML from an input stream
                xpp.setInput(getInputStream(url), "UTF_8");

                //variable to check if parser is inside <item> tag
                boolean insideItem = false;

                // Returns the type of current event: START_TAG, END_TAG, etc..
                int eventType = xpp.getEventType();
                model item = null;
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if (eventType == XmlPullParser.START_TAG) {

                        if (xpp.getName().equalsIgnoreCase("item")) {
                            insideItem = true;
                            item = new model();
                        } else if (xpp.getName().equalsIgnoreCase("title")) {
                            if (insideItem)
                                //titles.add(xpp.nextText()); //extract the headline
                                item.setTitles(xpp.nextText());
                        }
                        else if (xpp.getName().equalsIgnoreCase("description")) {
                            if (insideItem)
                                //descriptions.add(xpp.nextText());//extract the link of article
                               item.setDescriptions(xpp.nextText());
                          //add item to the arraylist after the last required tag has been extracted
                                items.add(item);
                        }
                    }else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
                        insideItem=false;
                    }

                    eventType = xpp.next(); //move to next element
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;

        }


        @Override
        protected void onPostExecute(String result) {
          //  tvtitle.setText(titles.get(1));
          //  tvDescription.setText(descriptions.get(1));
            tvtitle.setText(items.get(0).getTitles());
            tvDescription.setText(items.get(0).getDescriptions());

        }

    }
}

the object class:

public class model {
    public String titles;
    public String descriptions;

    public String getTitles() {
        return titles;
    }

    public void setTitles(String titles) {
        this.titles = titles;
    }

    public String getDescriptions() {
        return descriptions;
    }

    public void setDescriptions(String descriptions) {
        this.descriptions = descriptions;
    }
}

Proof that the parser is extracting the data while using descriptions/titles Arraylist: emulator screenshot with text extracted from xml

1 Answer 1

0

Found the solution to my problem...I just moved 'item=new model()' from inside the initial if statement( 'if (xpp.getName().equalsIgnoreCase("item"))') to the the top but inside the while loop.The new code block is now like this:

URL url = new URL("https://www.businessdailyafrica.com/539444-539444-view-asFeed-bfdflfz/index.xml");

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();

// We will get the XML from an input stream
xpp.setInput(getInputStream(url), "UTF_8");

boolean insideItem = false;

// Returns the type of current event: START_TAG, END_TAG, etc..
int eventType = xpp.getEventType();
String Title="";
String Description = "";

while (eventType != XmlPullParser.END_DOCUMENT) {
    model item = new model();

    if (eventType == XmlPullParser.START_TAG) {

        if (xpp.getName().equalsIgnoreCase("item")) {
            insideItem = true;

      }

        else if (xpp.getName().equalsIgnoreCase("title")) {
            if (insideItem)
                Title= xpp.nextText();
        }
        else if (xpp.getName().equalsIgnoreCase("description")) {
            if (insideItem)
                Description = xpp.nextText();

               item.setDescriptions(Description);
                item.setTitles(Title);
                //add item to the arraylist after the last required tag has been extracted
                items.add(item);

        }
    }else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
        insideItem=false;
    }

    eventType = xpp.next(); //move to next element
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.