RSSReader

neon 11.06.05 19:17

PHP5:llä toteutettu scripti RSS-virran parsimiseen. Hyödyntää simpleXML:ää ja SPL::Iterator iteraattoria.

 Tekstiversio  Arvo: 5 (7 ääntä)  Äänestä: +  -
<?PHP
class RSSReader implements Iterator
{
    private $xmlObject; //simpleXML objekti
    private $resultSet; //tulostaulukko
    private $limit;     //määrä
    private $iterator = 0;
    private $timestamps;
    private $meta;      //tietoja uutisvirrasta

    const sortASC = SORT_ASC;
    const sortDESC = SORT_DESC;
   
    /* ottaa argumentikseen RSS virran osoitteen ja tarvittaessa halutun elementtien määrän */
    public function __construct($url, $limit = 99999)
    {
        $this->limit = $limit;
        $this->timestamps = array();
        $this->resultSet = array();
        $this->meta = array();

        $this->xmlObject = @simplexml_load_file($url);
        if($this->xmlObject == false) {
            throw new Exception("Unable to get/parse data from $url"); //XML dataa ei kyetty jäsentämään
        }
        $this->parseData();
    }
   
    private static function parseTime($timeStr)
    {
        $month = array('Jan'=>1,'Feb'=>2,'Mar'=>3,'Apr'=>4,'May'=>5,'Jun'=>6,'Jul'=>7,'Aug'=>8,'Sep'=>9,'Oct'=>10,'Nov'=>11,'Dec'=>12);   
        $temp = sscanf($timeStr,"%s %d %s %d %d:%d:%d");
        $temp[2] = $month[$temp[2]];
        return mktime($temp[4],$temp[5],$temp[6],$temp[2],$temp[1],$temp[3]);
    }
    private function parseData()
    {
        $current = 0;
        /* haetaan virran otsikko, kuvaus ja URL */
        $this->meta[0] = utf8_decode($this->xmlObject->channel->title);
        $this->meta[1] = (string)$this->xmlObject->channel->link;
        $this->meta[2] = utf8_decode($this->xmlObject->channel->description);

        /* käydään virtaa läpi kunnes raja tulee vastaa tai kaikki elementit on käyty läpi */
        foreach($this->xmlObject->channel->item as $feedItem) {
            $this->timestamps[] = $timestamp = self::parseTime($feedItem->pubDate);
            $url = (string)$feedItem->link;
            $title = utf8_decode((string)$feedItem->title);
            $this->resultSet[] = array($timestamp,$url,$title);
            if(++$current > $this->limit)
                break;
        }
        /* vapautetaan resursseja */
        unset($this->xmlObject);
    }
    /* järjestää elementit kellonajan ja päivämäärän mukaan, joko nousevasti
    * (RSSReader::sortASC) tai laskevasti (RSSReader::sortDESC)
    */

    public function sort($order = self::sortDESC)
    {
        array_multisort($this->timestamps,$order,$this->resultSet);
    }
    public function getLink()
    {
        return $this->meta[1];
    }
    /* palauttaa RSS virran otsikon */
    public function getTitle()
    {
        return $this->meta[0];
    }
    /* palauttaa RSS virran kuvauksen */
    public function getDescription()
    {
        return $this->meta[2];   
    }
    /* implementoidaan Iterator iteraattorissa määritelty metodin current() */
    /* Palauttaa taulukon, joka sisältää data, johon iteraattori tällä hetkellä osoittaa */
    public function current()
    {
        $res = array('timestamp' => $this->resultSet[$this->iterator][0],
            'url' => $this->resultSet[$this->iterator][1],
            'title' => $this->resultSet[$this->iterator][2]);
        return array_merge($res,$this->resultSet[$this->iterator]);
    }
    /* implementoidaan Iterator iteraattorissa määritelty metodin next() */
    /* siirrytään seuraavaan elementtiin */
    public function next()
    {
        $this->iterator++;
    }
    /* implementoidaan Iterator iteraattorissa määritelty metodin key() */
    public function key()
    {
        return $this->iterator;
    }
    /* implementoidaan Iterator iteraattorissa määritelty metodin rewind() */
    /* siirrytään ensimmäiseen elementtiin */
    public function rewind()
    {
        $this->iterator = 0;
    }
    /* implementoidaan Iterator iteraattorissa määritelty metodin valid() */
    /* tutkitaan onko uusia elementtejä vielä jäljellä */
    public function valid()
    {
        return ((count($this->resultSet) > $this->iterator) ? true : false);
    }


}

/*ESIMERKKI:*/
$rss = new RSSReader("http://mureakuha.com/rss.php?stream=2");
$rss->sort(RSSReader::sortDESC);
echo '<h2><a href="'.$rss->getLink().'">'.$rss->getTitle().'</a></h2>';
foreach($rss as $item) {
    printf('<li><a href="%s">%s</a>(%s)</li>',$item['url'],$item['title'],date("d.m.Y H:i",$item['timestamp']));
}