我创建了一个应用程序,它将下载一个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;
}
}
答案 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;”