Internal::RssItem parseItem() { RssItem item; item.source = requestUrl; item.blogIcon = blogIcon; item.blogName = blogName; while (!streamReader.atEnd()) { switch (streamReader.readNext()) { case QXmlStreamReader::StartElement: if (streamReader.name() == QLatin1String("title")) item.title = streamReader.readElementText(); else if (streamReader.name() == QLatin1String("link")) item.link = streamReader.readElementText(); else if (streamReader.name() == QLatin1String("pubDate")) { QString dateStr = streamReader.readElementText(); // fixme: honor time zone! dateStr = dateStr.left(dateStr.indexOf('+')-1); item.pubDate = QDateTime::fromString(dateStr, "ddd, dd MMM yyyy HH:mm:ss"); } else if (streamReader.name() == QLatin1String("description")) item.description = shortenHtml(streamReader.readElementText()); break; case QXmlStreamReader::EndElement: if (streamReader.name() == QLatin1String("item")) return item; break; default: break; } } return RssItem(); }
void RssFetcher::parseXml(QIODevice *device) { QXmlStreamReader xmlReader(device); TagElement currentTag = otherElement; RssItem item; while (!xmlReader.atEnd()) { switch (xmlReader.readNext()) { case QXmlStreamReader::StartElement: currentTag = tagElement(xmlReader.name(), currentTag); if (currentTag == itemElement) { item = RssItem(); } break; case QXmlStreamReader::EndElement: if (xmlReader.name() == QLatin1String("item")) { m_items++; if ((uint)m_items > (uint)m_maxItems) return; emit newsItemReady(item.title, item.description, item.url); emit rssItemReady(item); } break; case QXmlStreamReader::Characters: if (!xmlReader.isWhitespace()) { switch (currentTag) { case titleElement: item.title += xmlReader.text().toString(); break; case descriptionElement: item.description += xmlReader.text().toString(); break; case categoryElement: item.category += xmlReader.text().toString(); break; case linkElement: item.url += xmlReader.text().toString(); break; case imageLinkElement: item.imagePath += xmlReader.text().toString(); break; default: break; } } // !xmlReader.isWhitespace() break; default: break; } } if (xmlReader.error() && xmlReader.error() != QXmlStreamReader::PrematureEndOfDocumentError) { qWarning("Welcome::Internal::RSSFetcher: XML ERROR: %d: %s (%s)", int(xmlReader.lineNumber()), qPrintable(xmlReader.errorString()), qPrintable(item.title)); } }
void RssParser::parseData(const QString &data) { qDebug() << "RssParser::parseData()";//: "<<data; m_items.clear(); QXmlStreamReader xml(data); while (!xml.atEnd()) { xml.readNext(); if (xml.tokenType() == QXmlStreamReader::StartElement) { // qDebug() << "RssParser::parseData(): StartElement/xml.name():"<<xml.name(); // Parse and collect the news items if (xml.name() == "item") { QString tag; RssItem item; while (!xml.atEnd()) { xml.readNext(); if (xml.name() == "item") { if (!item.title.isEmpty()) { item.date = item.date.replace("T"," "); item.date = item.date.replace(QRegExp("[+-]\\d{2}:\\d{2}"),""); m_items << item; qDebug() << "RssParser::parseData(): Added item: title:"<<item.title <<", "<<item.url <<", "<<item.date <<", "<<item.source; item = RssItem(); } break; } if (xml.tokenType() == QXmlStreamReader::StartElement) { tag = xml.name().toString(); // qDebug() << "RssParser::parseData(): StartElement/xml.name():"<<xml.name(); } else if (xml.isCharacters() && !xml.isWhitespace()) { // if(tag != "description") // qDebug() << "RssParser::parseData(): isCharacters/tag:"<<tag<<", text:"<<xml.text().toString(); if (tag == "title") item.title += xml.text().toString(); if (tag == "link") item.url += xml.text().toString(); if (tag == "creator") item.source += xml.text().toString(); if (tag == "date") item.date += xml.text().toString(); if (tag == "description") item.text += xml.text().toString(); } } } } } emit itemsAvailable(m_items); }