void LinNativeDisplayForm::parseRSSFeed() { QXmlStreamReader textReader(reply); while (!textReader.atEnd()) { textReader.readNext(); if (textReader.isStartElement()) { if (textReader.name() == "channel") { parseRSSChannel(textReader); // For now, only parse one channel: break; } } } if (textReader.hasError()) { QString err; err.append("QXmlStreamReader returned error: "); err.append(textReader.errorString()); err.append("\nFor URL: "); err.append(sourceUrl); QMaemo5InformationBox::information(0, err, 0); qWarning() << err; return; } reply->deleteLater(); }
// read and create items from a rss document void RssParser::parseFeed(const ParsingJob& job) { qDebug() << Q_FUNC_INFO << job.feedUrl << job.filePath; QFile fileRss(job.filePath); if (!fileRss.open(QIODevice::ReadOnly | QIODevice::Text)) { reportFailure(job, tr("Failed to open downloaded RSS file.")); return; } QXmlStreamReader xml(&fileRss); bool found_channel = false; while (xml.readNextStartElement()) { if (xml.name() == "rss") { // Find channels while (xml.readNextStartElement()) { if (xml.name() == "channel") { parseRSSChannel(xml, job.feedUrl); found_channel = true; break; } else { qDebug() << "Skip rss item: " << xml.name(); xml.skipCurrentElement(); } } break; } else if (xml.name() == "feed") { // Atom feed parseAtomChannel(xml, job.feedUrl); found_channel = true; break; } else { qDebug() << "Skip root item: " << xml.name(); xml.skipCurrentElement(); } } if (xml.hasError()) { reportFailure(job, xml.errorString()); return; } if (!found_channel) { reportFailure(job, tr("Invalid RSS feed at %1.").arg(job.feedUrl)); return; } // Clean up fileRss.close(); emit feedParsingFinished(job.feedUrl, QString()); fsutils::forceRemove(job.filePath); }