私のパートナーは偏執狂なので、いくつかの方法を言い換えなければなりませんでした. タイプミスが見られる場合は、それが原因である可能性がありますが、問題の原因であると思われる場合は指摘してください
XmlPullParser を使用し、80 行目で、値は常に「Channel」と等しくなります。skip を呼び出すと、parser.next() は常に 4 になります。このコードは以前は機能していましたが (学校の都合で脇に置いておきました)、現在は何も返しません。すべての内部タグをスキップしているようです。
理由はありますか?
更新: org.xmlpull.v1.XmlPullParserException が発生しているようです。例外をログに出力すると、次の結果が得られます。開始タグを探していると言っていると思いますが、null(?) を返しています:
07-17 00:02:14.564: E/XmlPullParserException(13604): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}channel (position:START_TAG <rss xmlns:a10='http://www.w3.org/2005/Atom' version='2.0'>@2:60 in java.io.InputStreamReader@4259cca8)
パーサークラスは次のとおりです。
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Log;
import android.util.Xml;
public class Parser {
// XML node keys
private final String KEY_ITEM = "item"; // parent node
private final String KEY_GUID = "guid";
private final String KEY_LINK = "link";
private final String KEY_TITLE = "title";
private final String KEY_DESCRIPTION = "description";
private final String KEY_UPDATED = "updated";
public static final String nameSpace = null;
public void parse(InputStream in, String type)
throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
readFeed(parser, type);
} finally {
in.close();
}
}
private void readFeed(XmlPullParser parser, String type)
throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, nameSpace, null);
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName(); // This is line 80
Log.e("READFEED", String.valueOf(name));
if (name.equals(KEY_ITEM)) {
DatabaseManager.sInstance.addItem(readItem(parser, type));
} else {
skip(parser);
}
}
}
private Item readItem(XmlPullParser parser, String sportType)
throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, nameSpace, KEY_ITEM);
Log.e("readItem", "readItem");
long id = 0;
String link = null;
int linkType = 0;
String title = null;
String description = null;
String updated = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
Log.e("readItem", name);
if (name.equalsIgnoreCase(KEY_LINK)) {
link = readTag(parser, KEY_LINK);
if (link.contains("player")) {
linkType = 1;
}
} else if (name.equalsIgnoreCase(KEY_TITLE)) {
title = readTag(parser, KEY_TITLE);
} else if (name.equalsIgnoreCase(KEY_DESCRIPTION)) {
description = readTag(parser, KEY_DESCRIPTION);
} else if (name.equalsIgnoreCase(KEY_GUID)) {
id = Long.valueOf(readTag(parser, KEY_GUID).replace(" ", ""));
} else if (name.equalsIgnoreCase(KEY_UPDATED)) {
updated = readTag(parser, KEY_UPDATED);
Pattern regex = Pattern.compile("T*");
Matcher regexMatcher = regex.matcher(updated);
if (regexMatcher.find()) {
String date = regexMatcher.group();
}
} else {
skip(parser);
}
}
return DatabaseManager.sInstance.newItem(id, sportType, link, linkType, title,
description, updated);
}
// Processes description tags in the feed.
private String readTag(XmlPullParser parser, String tag)
throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, nameSpace, tag);
String text = readText(parser);
parser.require(XmlPullParser.END_TAG, nameSpace, tag);
return text;
}
// For the tags title and description, extracts their text values.
private String readText(XmlPullParser parser) throws IOException,
XmlPullParserException {
String result = "";
if (parser.next() == XmlPullParser.TEXT) {
result = parser.getText();
parser.nextTag();
}
return result;
}
private void skip(XmlPullParser parser) throws XmlPullParserException,
IOException {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0) {
switch (parser.next()) {
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
}
そして、これがコードがプルしている XML の構造です。
<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title></title>
<link></link>
<description></description>
<language></language>
<lastBuildDate></lastBuildDate>
<item>
<guid isPermaLink="false"></guid>
<link></link>
<title></title>
<description></description>
<a10:updated></a10:updated>
</item>
<item>
<guid isPermaLink="false"></guid>
<link></link>
<title></title>
<description></description>
<a10:updated></a10:updated>
</item>
<item>
<guid isPermaLink="false"></guid>
<link></link>
<title></title>
<description></description>
<a10:updated></a10:updated>
</item>
<item>
<guid isPermaLink="false"></guid>
<link></link>
<title></title>
<description></description>
<a10:updated></a10:updated>
</item>
</channel>
</rss>
よろしくお願いします:)