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();
    }
Exemple #2
0
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));
    }
}
Exemple #3
0
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);
}