我尝试解析XML文档并将结果添加到列表中。 我每次都变空了。我不知道我做错了什么。 读取在主线程之外,最后它调用mathod将Intent发送到另一个Activity。 您可以在代码中查看URL中的XML。 谢谢回答。 这是我的代码:
t = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(
"http://www.ynet.co.il/Integration/StoryRss4880.xml");
XmlPullParserFactory factory = XmlPullParserFactory
.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(getInputStream(url), "UTF_8");
boolean insideItem = false;
int eventType = xpp.getEventType();
String l = null;
String tit = null;
String p = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equalsIgnoreCase("item")) {
insideItem = true;
if (xpp.getName().equalsIgnoreCase("title")) {
if (insideItem) {
l = xpp.nextText();
}
} else if (xpp.getName().equalsIgnoreCase(
"link")) {
if (insideItem) {
tit = xpp.nextText();
}
} else if (xpp.getName().equalsIgnoreCase(
"description")) {
if (insideItem) {
String array[] = xpp.nextText().split(
"img src='");
String array1[] = array[1]
.split("' alt");
p = array1[0];
}
}
MyArticle.getInstance().getmArticle()
.add(new Article(l, tit, p));
}
} else if (eventType == XmlPullParser.END_TAG
&& xpp.getName().equalsIgnoreCase("item")) {
insideItem = false;
}
eventType = xpp.next();
}
if (eventType == XmlPullParser.END_DOCUMENT) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
GoTOActivity(context);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
t.start();
答案 0 :(得分:0)
问题在于你的内部解析循环。您测试xpp.getName()是否等于“item”,如果是,则将 insideItem 设置为true,然后立即测试xpp.getName()是否等于“title”:< / p>
if (xpp.getName().equalsIgnoreCase("item")) {
insideItem = true;
if (xpp.getName().equalsIgnoreCase("title")) {
if (insideItem) {
l = xpp.nextText();
}
}
在这种情况下它永远不会等于“标题”,因为你只是测试了它并且它等于“item”。在测试“title”之前,您需要读取下一个XML开始标记,如下所示:
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equalsIgnoreCase("item")) {
insideItem = true;
tit = null; l = null; p = null; // clear variables
} else if (xpp.getName().equalsIgnoreCase("title")) {
if (insideItem) {
tit = xpp.nextText();
}
} else if (xpp.getName().equalsIgnoreCase("link")) {
if (insideItem) {
l = xpp.nextText();
}
} else if (xpp.getName().equalsIgnoreCase("description")) {
if (insideItem) {
String array[] = xpp.nextText().split(
"img src='");
String array1[] = array[1]
.split("' alt");
p = array1[0];
}
}
} else if (eventType == XmlPullParser.END_TAG
&& xpp.getName().equalsIgnoreCase("item")) {
insideItem = false;
MyArticle.getInstance().getmArticle()
.add(new Article(l, tit, p));
}
eventType = xpp.next();
}
另请注意,添加新文章的代码会在您检测到“item”关闭标记的位置。最后,我假设 tit 是标题而 l 是链接,在这种情况下你需要交换它们,所以当你读到 tit 时标题,反之亦然。希望这会有所帮助。