1

In my application, I am trying to parse XML and show the data in a ListView using an ArrayAdapter. Whenever I run the application, the application just shows the action bar and a blank screen where the ListView and data should be. There is no errors in the LogCat, so it seems to just be a problem displaying the data, but I can not find what the problem is. I am trying to parse this XML:

<system>
<name>11 Com</name>
<rightascension>12 20 43</rightascension>
<declination>+17 47 34</declination>
<distance>110.6</distance>
<star>
    <mass>2.7</mass>
    <radius>19</radius>
    <magV>4.74</magV>
    <magB errorminus="0.02" errorplus="0.02">5.74</magB>
    <magJ errorminus="0.334" errorplus="0.334">2.943</magJ>
    <magH errorminus="0.268" errorplus="0.268">2.484</magH>
    <magK errorminus="0.346" errorplus="0.346">2.282</magK>
    <metallicity>-0.35</metallicity>
    <spectraltype>G8 III</spectraltype>
    <planet>
        <name>11 Com b</name>
        <list>Confirmed planets</list>
        <mass>19.4</mass>
        <period>326.03</period>
        <semimajoraxis>1.29</semimajoraxis>
        <eccentricity>0.231</eccentricity>
        <discoverymethod>RV</discoverymethod>
        <lastupdate>11/12/23</lastupdate>
        <discoveryyear>2008</discoveryyear>
        <temperature>799.7</temperature>
    </planet>
    <name>11 Com</name>
    <temperature>4742.0</temperature>
</star>
<videolink>http://youtu.be/qyJXJJDrEDo</videolink>

And here is the Star.java:

public class Star {

//Star Info
private String starName;
private String starMass;
private String starRadius;
private String starMagV;
//TODO Add support for plus or minus error in measurement
private String starMagB;
private String starMagJ;
private String starMagH;
private String starMagK;
private String starMetallicity;
private String starSpectralType;
private String starTemp;


public Star(String starName, String starMass, String starRadius, String starMagV, String starMagB, String starMagJ, String starMagH, String starMagK, String starMetallicity, String starSpectralType, String starTemp) {
    this.starName = starName;
    this.starMass = starMass;
    this.starRadius = starRadius;
    this.starMagV = starMagV;
    this.starMagB = starMagB;
    this.starMagJ = starMagJ;
    this.starMagH = starMagH;
    this.starMagK = starMagK;
    this.starMetallicity = starMetallicity;
    this.starSpectralType = starSpectralType;
    this.starTemp = starTemp;
}

public Star() {
    this.starName = null;
    this.starMass = null;
    this.starRadius = null;
    this.starMagV = null;
    this.starMagB = null;
    this.starMagJ = null;
    this.starMagH = null;
    this.starMagK = null;
    this.starMetallicity = null;
    this.starSpectralType = null;
    this.starTemp = null;
}
   /*
    * Star Getters and Setters
    */

public String getStarName() {
    return starName;
}
public void setStarName(String starName) {
    this.starName = starName;
}

public String getStarMass() {
    return starMass;
}
public void setStarMass(String starMass) {
    this.starMass = starMass;
}

public String getStarRadius() {
    return starRadius;
}
public void setStarRadius(String starRadius) {
    this.starRadius = starRadius;
}

//Star magnitude Setter and Getters

public String getStarMagV() {
    return starMagV;
}
public void setStarMagV(String starMagV) {
    this.starMagV = starMagV;
}

public String getStarMagB() {
    return starMagB;
}
public void setStarMagB(String starMagB){
    this.starMagB = starMagB;
}

public String getStarMagH() {
    return starMagH;
}
public void setStarMagH(String starMagH){
    this.starMagH = starMagH;
}

public String getStarMagJ() {
    return starMagJ;
}
public void setStarMagJ(String starMagJ){
    this.starMagJ = starMagJ;
}

public String getStarMagK() {
    return starMagK;
}
public void setStarMagK(String starMagK){
    this.starMagK = starMagK;
}

public String getStarMetallicity() {
    return starMetallicity;
}
public void setStarMetallicity(String starMetallicity) {
    this.starMetallicity = starMetallicity;
}

public String getStarSpectralType() {
    return starSpectralType;
}
public void setStarSpectralType(String starSpectralType) {
    this.starSpectralType = starSpectralType;
}

public String getStarTemp() {
    return starTemp;
}
public void setStarTemp(String starTemp) {
    this.starTemp = starTemp;
}

public String toString() {
    return "Star Name: " + starName + "/n Mass: " + starMass + "/n Radius: " + starRadius + "/n Mag V: " + starMagV + "/n Mag B: " + starMagB + "/n Mag H: " + starMagH + "/n Mag J: " + starMagJ + "/n Mag K: " + starMagK + "/n Metallicity: " + starMetallicity +    "/n Spectral Type: " + starSpectralType + "/n Temperature: " + starTemp;
}
}

And this is the XMLPullParserStar.java class:

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import beans.System;
import beans.*;

public class XMLPullParserStar {

List<Star> stars;

private Star star;
public String starText;

public XMLPullParserStar() {
    stars = new ArrayList<Star>();
}

public List<Star> getStar() {
    return stars;
}

public List<Star> parse(InputStream is) {
    XmlPullParserFactory factory = null;
    XmlPullParser parser = null;
    try {
        factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        parser = factory.newPullParser();

        parser.setInput(is, null);

        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagname = parser.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase("star")) {
                        star = new Star();
                    }
                    break;

                case XmlPullParser.TEXT:
                    starText = parser.getText();
                    break;

                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase("name")) {
                        star.setStarName(starText);
                        //skip(parser);
                    } else if (tagname.equalsIgnoreCase("radius")) {
                        star.setStarRadius(starText);
                    }  else if (tagname.equalsIgnoreCase("magv")) {
                        star.setStarMagV(starText);
                    } else if (tagname.equalsIgnoreCase("magb")) {
                        star.setStarMagB(starText);
                    } else if (tagname.equalsIgnoreCase("magj")) {
                        star.setStarMagJ(starText);
                    } else if (tagname.equalsIgnoreCase("magh")) {
                        star.setStarMagH(starText);
                    } else if (tagname.equalsIgnoreCase("magk")) {
                        star.setStarMagK(starText);
                    } else if (tagname.equalsIgnoreCase("metallicity")) {
                        star.setStarMetallicity(starText);
                    } else if (tagname.equalsIgnoreCase("spectraltype")) {
                        star.setStarSpectralType(starText);
                    } else if (tagname.equalsIgnoreCase("temperature")) {
                        star.setStarTemp(starText);
                    } else if (tagname.equalsIgnoreCase("name")) {
                        star.setStarName(starText);
                    }
                    break;

                default:
                    break;
            }
            eventType = parser.next();
        }

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

    return stars;
}
}

And here is the MainActivity.java:

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup; 
import android.os.Build; 
import android.widget.ArrayAdapter;
import android.widget.ListView;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.List;
import beans.*;
import beans.Star;
import xml.XMLPullParserStar;

public class MainActivity extends Activity {

ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    listView = (ListView) findViewById(R.id.list);

    List<Star> systems = null;
    try {
        XMLPullParserStar parser = new XMLPullParserStar();
        systems = parser.parse(getAssets().open("1RXS1609.xml"));
        ArrayAdapter<Star> adapter =
                new ArrayAdapter<Star>(this, R.layout.list_item, systems);
        listView.setAdapter(adapter);
    } catch (IOException e) {
        e.printStackTrace();
    }

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

When I run the application, the application loads, but where the ListView should be with the star data, nothing shows up. It is just a blank white.

1 Answers1

0

here is how i do xml parsing

package com.example.parseonly;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    String artist;
    String key;Button   mButton;
    EditText mEdit;ProgressDialog pd;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button)findViewById(R.id.b1);
        mEdit   = (EditText)findViewById(R.id.t1);
        pd = new ProgressDialog(this);
         pd.setMessage("Loading...");

        mButton.setOnClickListener(
                new View.OnClickListener()
                {
                    public void onClick(View view)
                    {
                        Log.v("EditText", mEdit.getText().toString());
                        artist=mEdit.getText().toString();
                        new Xmlparse().execute(); 

                    }
                });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    class Xmlparse extends AsyncTask<Void,Drawable,Drawable>
     {
        @SuppressWarnings("deprecation")
        protected void onPostExecute(Drawable result) {
           // super.onPostExecute(result);
            LinearLayout LL=(LinearLayout) findViewById(R.id.LL);
             LL.setBackgroundDrawable(result);
             pd.dismiss(); 

            // Toast.makeText(getApplicationContext(),result, 1000).show();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pd.show();
        }
        @Override
        protected Drawable doInBackground(Void... params) {
            Drawable s =getData();
            return s;
        }  

        public Drawable getData()
        {  Drawable drawable = null;//=new BitmapDrawable(bmp); 

            artist=artist.trim();
            artist=artist.replace(" ", "%20");

            try{

              URL url = new URL("http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=" +artist+              "&api_key=1732077d6772048ccc671c754061cb18");
            URLConnection connection = url.openConnection();
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();

            final Document document = db.parse(connection.getInputStream());
            document.getDocumentElement().normalize();
            XPathFactory xPathfactory = XPathFactory.newInstance();
            XPath xPathEvaluator = xPathfactory.newXPath();
            XPathExpression nameExpr = xPathEvaluator.compile("//lfm/artist/image");
            // XPathExpression nameExpr = xPathEvaluator.compile("//lfm/tracks/track/image");
            NodeList nl = (NodeList) nameExpr.evaluate(document, XPathConstants.NODESET);


            for (int zzz = 0; zzz < nl.getLength(); zzz++)
            {
                Node currentItem = nl.item(zzz);
                key = currentItem.getTextContent();


                // key = currentItem.getAttributes().getNamedItem("uri").getNodeValue();
            }URL ulrn = new URL(key);
            HttpURLConnection con = (HttpURLConnection)ulrn.openConnection();
            InputStream is = con.getInputStream();
            Bitmap bmp = BitmapFactory.decodeStream(is);
            drawable=new BitmapDrawable(bmp); 
            }
            catch(Exception e)
            {}
            return drawable;}   
      }}

the xml file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LLL "
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=".Enter the name of the music artists below and click the submit button " />


    <EditText
        android:id="@+id/t1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Submit" />

    <LinearLayout
        android:id="@+id/LL "
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingTop="10dp" >
    </LinearLayout>

</LinearLayout>
Ankit Srivastava
  • 354
  • 1
  • 5
  • 24