Я пытаюсь сделать rss-ридер с помощью xmlpullparser. Допустим, у меня есть такой xml-файл:
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>RSS Title</title>
<description>This is an example of an RSS feed</description>
<link>http://www.someexamplerssdomain.com/main.html</link>
<lastBuildDate>Mon, 06 Sep 2010 00:01:00 +0000 </lastBuildDate>
<pubDate>Mon, 06 Sep 2009 16:20:00 +0000 </pubDate>
<ttl>1800</ttl>
<item>
<title>Example entry</title>
<description>Here is some text containing an interesting description.</description>
<link>http://www.wikipedia.org/</link>
<guid>unique string per item</guid>
<pubDate>Mon, 06 Sep 2009 16:20:00 +0000 </pubDate>
</item>
</channel>
</rss>
Когда я пытаюсь его прочитать, он читает тег rss, а затем, перед чтением канала, читает ноль. Переместите тег канала рядом с тегом rss, например:
<rss version="2.0"><channel>
<title>...
У меня больше нет этой проблемы, но я не могу этого сделать, потому что я не хочу читать только свои xml-файлы.
Это часть кода, который я использую:
public Feed rss() throws XmlPullParserException, IOException {
matchStart(Tag.rss);
move();
Feed channel = channel();
matchEnd(Tag.rss);
return channel;
}
private Feed channel() throws XmlPullParserException, IOException {
matchStart(Tag.channel);
move();
String title = null;
String link = null;
String description = null;
String pubDate = null;
List<FeedMessage> items = new ArrayList<FeedMessage>();
while(eventType != XmlPullParser.END_TAG) {
if(xmlParser.getEventType() != XmlPullParser.START_TAG) { //Look if we are checking an open tag <tag> if not es</tag> then go to the next one
move();
continue;
}
String name = xmlParser.getName();
switch(name) {
case Tag.title: title = title(); break;
case Tag.link: link = link(); break;
case Tag.description: description = description(); break;
case Tag.pubDate: pubDate = pubDate(); break;
case Tag.item: items.add(item()); break;
default: skip(); break;
}
move();
}
Feed channel = new Feed(title, link, description, pubDate, items);
matchEnd(Tag.channel);
return channel;
}
где matchStart и matchEnd вызывают xmlParser.require, чтобы проверить START_TAG и END_TAG и переместить его, как это определено следующим образом:
void move() throws XmlPullParserException, IOException {
eventType = xmlParser.next();
}
Я не могу найти, в чем проблема, что-то не так с кодом или логикой?