Android:解析XML不会返回任何值

时间:2017-04-28 18:01:44

标签: android xml-parsing

我创建了一个应用程序,它将下载一个xml文件,然后解析它,并使其适应列表视图,但我在解析xml时面临一个问题,首先是: MainActivity.java

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    downloadData downloadData = new downloadData();
    downloadData.execute("http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topfreeapplications/limit=10/xml");
 }

 private class downloadData extends AsyncTask<String, Void, String> {
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        ParseApplications parseApplications = new ParseApplications();
        parseApplications.parse(s);
    }

    @Override
    protected String doInBackground(String... params) {
        String rssFeed = downloadXML(params[0]);
        if (rssFeed == null) {

        }
        return rssFeed;
    }

    private String downloadXML(String urlPath) {
        StringBuilder xmlResult = new StringBuilder();
        try {
            URL url = new URL(urlPath);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            int charsRead;
            char[] inputBuffer = new char[500];
            while (true) {
                charsRead = reader.read(inputBuffer);
                if (charsRead < 0) {
                    break;
                }
                if (charsRead > 0) {
                    xmlResult.append(String.copyValueOf(inputBuffer), 0, charsRead);
                }
            }
            reader.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return xmlResult.toString();
    }

  }
}

MainActivity.class在下载XML方面运行良好,但是在解析xml时,虽然它解析了它,但没有返回值:

ParseApplications.java

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

import java.io.StringReader;
import java.util.ArrayList;

public class ParseApplications {
private ArrayList<FeedEntry> applications;

public ParseApplications() {
    this.applications = new ArrayList<>();
}

public ArrayList<FeedEntry> getApplications() {
    return applications;
}

public boolean parse(String xmlData) {
    boolean status = true;
    FeedEntry currentRecord = null;
    boolean inEntry = false;
    String textValue = "";

    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(new StringReader(xmlData));
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagName = xpp.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if ("entry".equalsIgnoreCase(tagName)) {
                        inEntry = true;
                        currentRecord = new FeedEntry();
                    }
                    break;
                case XmlPullParser.TEXT:
                    textValue = xpp.getText();
                    break;
                case XmlPullParser.END_TAG:
                    if (inEntry) {
                        if ("entry".equalsIgnoreCase(tagName)) {
                            applications.add(currentRecord);
                            inEntry = false;
                        } else if ("name".equalsIgnoreCase(tagName)) {
                            currentRecord.setName(textValue);
                        } else if ("artist".equalsIgnoreCase(tagName)) {
                            currentRecord.setArtist(textValue);
                        } else if ("releaseDate".equalsIgnoreCase(tagName)) {
                            currentRecord.setReleaseDate(textValue);
                        } else if ("image".equalsIgnoreCase(tagName)) {
                            currentRecord.setImageURL(textValue);
                        } else if ("summary".equalsIgnoreCase(tagName)) {
                            currentRecord.setSummary(textValue);
                        }
                    }
                    break;
                default:
                    //Nothing to do
                    eventType = xpp.next();

            }
        }
    } catch (Exception e) {
        status = false;
        e.printStackTrace();
    }
    return status;
  }
}

这是另一个类:

FeedEntry.java

public class FeedEntry {
private String name;
private String artist;
private String releaseDate;
private String summary;
private String imageURL;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getArtist() {
    return artist;
}

public void setArtist(String artist) {
    this.artist = artist;
}

public String getReleaseDate() {
    return releaseDate;
}


public void setReleaseDate(String releaseDate) {
    this.releaseDate = releaseDate;
}

public String getSummary() {
    return summary;
}

public void setSummary(String summary) {
    this.summary = summary;
}

public String getImageURL() {
    return imageURL;
}

public void setImageURL(String imageURL) {
    this.imageURL = imageURL;
}

@Override
public String toString() {
    return "name='" + name + '\n' +
            ", artist='" + artist + '\n' +
            ", releaseDate='" + releaseDate + '\n' +
            ", imageURL='" + imageURL;
   }
}

2 个答案:

答案 0 :(得分:0)

我觉得我很安静,但是,它还可以帮助其他人。所以我发布了我的答案。一旦卡在第一个标签上,请检查解析方法。它应该是这样的

 public boolean parse(String xmlData) {
    boolean status = true;
    FeedEntry currentRecord = null;
    boolean inEntry = false;
    String textValue = "";

    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(new StringReader(xmlData));
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagName = xpp.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagName.equalsIgnoreCase("entry")) {
                        inEntry = true;
                        currentRecord = new FeedEntry();
                    }
                    break;
                case XmlPullParser.TEXT:
                    textValue = xpp.getText();
                    break;
                case XmlPullParser.END_TAG:
                    if (inEntry) {
                        if (tagName.equalsIgnoreCase("entry")) {
                            applications.add(currentRecord);
                            inEntry = false;
                        } else if (tagName.equalsIgnoreCase("name")) {
                            currentRecord.setName(textValue);
                        } else if (tagName.equalsIgnoreCase("artist")) {
                            currentRecord.setArtist(textValue);
                        } else if (tagName.equalsIgnoreCase("releaseDate")) {
                            currentRecord.setReleaseDate(textValue);
                        } else if (tagName.equalsIgnoreCase("image")) {
                            currentRecord.setImageURL(textValue);
                        } else if (tagName.equalsIgnoreCase("summary")) {
                            currentRecord.setSummary(textValue);
                        }
                    }
                    break;
                default:
                    //Nothing to do
                    break;
            }
            eventType = xpp.next(); // this should come after switch case 

        }
    } catch (
            Exception e
            )

    {
        status = false;
        e.printStackTrace();
    }

    return status;
}

答案 1 :(得分:0)

在XmlPullParser中。END_TAG:案例: 尝试删除“ inEntry = false;”