Seite 1 von 1

RSS NewReader / XML File auslesen Tiefe knoten (child)

Verfasst: 18. August 2006 16:26
von patrik08
Einfache knoten im xml file zu lesen ist einfach jedoch .... in der tiefen zu gehen muss man etwas denken....

beispiel feed http://rss.cnn.com/rss/cnn_world.rss


Mit eine einzige funktion hole ich alle parameter....

Code: Alles auswählen

typedef QMap<int, QStringList> RssParams;

/* read a static rss version 1/2 file and return QMap params of link title description */
RssParams ReadRssFile( QString fileplace , int limiter )
{
   RssParams contingent;
   QFile xmlfile( fileplace );
   QString errorStr, obname, inhalt;
   int errorLine, errorColumn, position;
   position = 0 -1;
   QDomDocument doc("RSS"); 
     if(!xmlfile.open( QIODevice::ReadOnly ) ) {
      return contingent;
     } 
     if (!doc.setContent(&xmlfile,true, &errorStr, &errorLine, &errorColumn)) { 
      xmlfile.close(); 
      return contingent;  
     }
    QDomElement root = doc.documentElement();
    QDomElement chanelbase = root.firstChildElement("channel");
    QDomElement child = chanelbase.firstChildElement("item");
        while (!child.isNull()) {
           QString title = child.firstChildElement("title").text();
           QString desc = child.firstChildElement("description").text();
           QString urirss = child.firstChildElement("link").text();
           if (!title.isEmpty() and !desc.isEmpty() and !urirss.isEmpty()) {
               position++;
               if (position < limiter) {
               contingent.insert(position,QStringList() << encodeBase64(urirss) << encodeBase64(title) << encodeBase64(desc));
               }
           }
           child = child.nextSiblingElement("item");
        }
   xmlfile.close(); 
   return contingent;
}

und auslesen der paramenter .....

Code: Alles auswählen

      /* read params */
            /* deklaration */
            int sums;     
            RssParams pollparam;
            QStringList rssreader;

            pollparam = ReadRssFile("file.xml",10);
            sums = pollparam.size();

            rssreader.clear();
            RssParams::Iterator it;
              for ( it = pollparam.begin(); it != pollparam.end(); ++it ) { 
                QStringList dx = it.value(); 
                QString ruri = decodeBase64(QString(dx.at(0)));
                QString rtit = Replas(decodeBase64(QString(dx.at(1))));
                QString rdes = Replas(decodeBase64(QString(dx.at(2))));
                QString preline = QString("Des-> %1\n").arg(rdes);
                QString rspiline = QString( "NR.xx Uri-> %1\nTit-> %2\n%3" ).arg( ruri , rtit , rdes );
                rssreader.append(rspiline);
               }
            QString LineALL = rssreader.join("\n");

Ich codiere den Inhalt zu Base64 damit ich in der datenbank keine quote problemen habe ....

Code: Alles auswählen

/* encode to name */
QString encodeBase64( QString xml )
{
    QByteArray text;
    text.append(xml);
    return text.toBase64();
}

/* decode to name */
QString decodeBase64( QString xml )
{
    QByteArray xcode("");;
    xcode.append(xml);
    QByteArray precode(QByteArray::fromBase64(xcode));
    QString notetxt = precode.data();
    return notetxt;
}
IMO : Replas( string ) ist nur eine suche & ersetzen funktion (Zensur!) kann man weglassen oder neu schreiben...



Falls jemand es noch einfacher machen kann .... bin fuer jedes komment dankbar....