XMLPullParser 抛出预期错误:开始标记
XMLPullParser throws Error Expected: Start Tag
我正在为 Android 构建一个 RSS Reader,但我不知道我做错了什么。
我使用了这个教程:http://developer.android.com/training/basics/network-ops/xml.html
我总是得到一个错误:
/RSSXMLHELPER:: Error: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}rss (position:START_DOCUMENT null@1:1 in java.io.InputStreamReader@12c8977c)
这是我的 XMLPullParser class:
public class RSSXMLHelper {
PostData postData;
ArrayList<PostData> pList;
public ArrayList<PostData> parse(InputStream in) throws XmlPullParserException, IOException {
if (in != null) {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
return readRss(parser);
} finally {
if (in != null) {
in.close();
}
}
} else {
postData = new PostData();
pList = new ArrayList<>();
//l.add(entry);
return pList;
}
}
private ArrayList<PostData> readRss(XmlPullParser parser)
throws XmlPullParserException, IOException {
ArrayList<PostData> items = new ArrayList<>();
parser.require(XmlPullParser.START_TAG, null, "rss");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("channel")) {
items.addAll(readChannel(parser));
} else {
skip(parser);
}
}
return items;
}
private ArrayList<PostData> readChannel(XmlPullParser parser)
throws IOException, XmlPullParserException {
ArrayList<PostData> items = new ArrayList<>();
parser.require(XmlPullParser.START_TAG, null, "channel");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("item")) {
items.add(readItem(parser));
} else {
skip(parser);
}
}
return items;
}
private PostData readItem(XmlPullParser parser) throws XmlPullParserException, IOException {
PostData postData = new PostData();
parser.require(XmlPullParser.START_TAG, null, "item");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("title")) {
postData.setPostTitle(readTitle(parser));
} else {
skip(parser);
}
}
return postData;
}
private String readTitle(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, null, "title");
String title = readText(parser);
parser.require(XmlPullParser.END_TAG, null, "title");
return title;
}
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;
}
}
}
}
我找了2个小时的错误,但我真的不知道我的代码有什么问题....
编辑:
XML 文件:ifrick.ch/feed
我明白了。密码正确。
问题是我正在写一个新的 Class 并将其放在现有的 class 后面进行测试。当涉及到新的 XMLReader Class...
时,Inputstream 已经关闭
我正在为 Android 构建一个 RSS Reader,但我不知道我做错了什么。 我使用了这个教程:http://developer.android.com/training/basics/network-ops/xml.html
我总是得到一个错误:
/RSSXMLHELPER:: Error: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}rss (position:START_DOCUMENT null@1:1 in java.io.InputStreamReader@12c8977c)
这是我的 XMLPullParser class:
public class RSSXMLHelper {
PostData postData;
ArrayList<PostData> pList;
public ArrayList<PostData> parse(InputStream in) throws XmlPullParserException, IOException {
if (in != null) {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
return readRss(parser);
} finally {
if (in != null) {
in.close();
}
}
} else {
postData = new PostData();
pList = new ArrayList<>();
//l.add(entry);
return pList;
}
}
private ArrayList<PostData> readRss(XmlPullParser parser)
throws XmlPullParserException, IOException {
ArrayList<PostData> items = new ArrayList<>();
parser.require(XmlPullParser.START_TAG, null, "rss");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("channel")) {
items.addAll(readChannel(parser));
} else {
skip(parser);
}
}
return items;
}
private ArrayList<PostData> readChannel(XmlPullParser parser)
throws IOException, XmlPullParserException {
ArrayList<PostData> items = new ArrayList<>();
parser.require(XmlPullParser.START_TAG, null, "channel");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("item")) {
items.add(readItem(parser));
} else {
skip(parser);
}
}
return items;
}
private PostData readItem(XmlPullParser parser) throws XmlPullParserException, IOException {
PostData postData = new PostData();
parser.require(XmlPullParser.START_TAG, null, "item");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("title")) {
postData.setPostTitle(readTitle(parser));
} else {
skip(parser);
}
}
return postData;
}
private String readTitle(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, null, "title");
String title = readText(parser);
parser.require(XmlPullParser.END_TAG, null, "title");
return title;
}
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;
}
}
}
}
我找了2个小时的错误,但我真的不知道我的代码有什么问题....
编辑:
XML 文件:ifrick.ch/feed
我明白了。密码正确。
问题是我正在写一个新的 Class 并将其放在现有的 class 后面进行测试。当涉及到新的 XMLReader Class...
时,Inputstream 已经关闭