Avatar billede nightcoder Nybegynder
30. juli 2008 - 08:53 Der er 15 kommentarer

RSS parser med flere kilder

Hvordan får jeg dette script til at kunne vise en liste af nyheder fra flere kilder, gerne sorteret efter dato og tid.


<?php
  class RSSParser    {
    var $link = "";
    var $title = "";
    var $pubdate = "";
    var $description = "";
    var $inside_item = false;
    var $current_tag = "";
    var $array_items = array();
    function startElement($parser, $name, $attrs='')
    {
      $this->current_tag = $name;
      if ($this->current_tag == "ITEM")
      {
        $this->inside_item = true;
      }
    }
    function endElement($parser, $tagName, $attrs='')
    {
      if ($tagName == "ITEM")
      {
        $this->array_items[] = array($this->title, $this->link, $this->description, $this->pubdate);
       
        $this->link = "";
        $this->title = "";
        $this->description = "";
        $this->pubdate = "";
       
        $this->inside_item = false;
      }
    }
    function characterData($parser, $data)
    {
      if ($this->inside_item)
      {
        switch($this->current_tag)
        {
          case "TITLE":
            $this->title .= $data;
          break;
          case "DESCRIPTION":
            $this->description .= $data;
          break;
          case "LINK":
            $this->link .= $data;
          break;
          case "PUBDATE":
            $this->pubdate .= $data;
          break;
         
          default:
          break;
        }
      }
    }
    function parse_results($xml_parser, $rss_parser, $file)
    {
      xml_set_object($xml_parser, &$rss_parser);
      xml_set_element_handler($xml_parser, "startElement", "endElement");
      xml_set_character_data_handler( $xml_parser, "characterData");
      $xml_data = @file_get_contents($file);
      if ($xml_data)
      {
        xml_parse($xml_parser, $xml_data);
      }
      xml_parser_free($xml_parser);
    }
  } // end class

  $xml_parser = xml_parser_create();
  $rss_parser = new RSSParser();

  $rss_parser->parse_results($xml_parser, &$rss_parser, "http://sporten.tv2.dk/rss/sporten.xml");
  $rss_array = $rss_parser->array_items;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>RSS Sporten</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  </head>
  <body>
<?
  if (is_array($rss_array))
  {
    foreach($rss_array as $array)
    {
      list($title, $link, $description, $pubdate) = $array;
      // Her kommer det så ud...
      echo "$title, $link, $description, $pubdate";
    }
  }
?>
  </body>
</html>
Avatar billede jakobdo Ekspert
30. juli 2008 - 09:55 #1
Kig på magpierss.
Den indlæser feeds til et array.
Det array kan du så sortere som du vil.
Eller overlæse i et dummy array og bruge dato/tid som key.
Avatar billede coderdk Praktikant
30. juli 2008 - 13:52 #2
Det er så meningen at du skal gemme feedet i din database - derfra er det så simpelt at vise alle blandet, sorteret efter dato/tid ;)
Avatar billede jakobdo Ekspert
30. juli 2008 - 14:09 #3
Nej, man kan jo trække flere feeds ind i et script.
Gemme output i et array og sortere efter dato/tid.
Så ikke nødvendigvis via en database.
Avatar billede coderdk Praktikant
30. juli 2008 - 14:35 #4
Jo, jo, det kan selvfølgelig lade sig gøre, men jeg mener - der er flere sites, hvor du bliver bannet, hvis du begynder at hente RSS hver gang du har en besøgende ;) Det er meningen at du skal cache lidt og kun hente en gang imellem ;P
Avatar billede jakobdo Ekspert
30. juli 2008 - 14:38 #5
magpierss understøtter cache! :o)
Avatar billede nightcoder Nybegynder
30. juli 2008 - 20:26 #6
Har nu fået Magpierss opsat, og det er jo ganske godt gennemarbejdet :-) Her er koden, men hvordan får jeg så indsat en sti eller 2 ekstra?

<?php

require_once('magpierss/rss_fetch.inc');
$url = 'http://www.lalala.dk/lala.xml';

if ( $url ) {
   
$num_items = 15;
$rss = fetch_rss($url);
$items = array_slice($rss->items, 0, $num_items);

    echo "<ul>";
    foreach ($items as $item) {
        $href = $item['link'];
        $title = $item['title'];   
        $published = parse_w3cdtf($item['dc']['date']);
        $newdate = date("h:i:s A", $published);

        echo "<li><a href=$href>$title - $newdate</a></li>";
    }
    echo "</ul>";
}

?>
Avatar billede jakobdo Ekspert
30. juli 2008 - 21:00 #7
Du kunne f.eks. lave det som:

<?php

require_once('magpierss/rss_fetch.inc');
$urls = array('http://www.lalala.dk/lala1.xml','http://www.lalala.dk/lala2.xml','http://www.lalala.dk/lala3.xml');

$output = array();

if(is_array($urls)){
    $num_items = 15;
   
    for($i = 0; $i < count($urls); $i++){
        $rss = fetch_rss($urls[$i]);
        $items = array_slice($rss->items, 0, $num_items);
       
        foreach ($items as $item) {
            $href = $item['link'];
            $title = $item['title']; 
            $published = parse_w3cdtf($item['dc']['date']);
            $newdate = date("h:i:s A", $published);
     
            $output[$published] = "<li><a href=$href>$title - $newdate</a></li>";
        }
    }
}

sort($output);
echo '<pre>';
print_r($output);
echo '</pre>';
?>
Avatar billede nightcoder Nybegynder
30. juli 2008 - 21:23 #8
Får følgende fejl:

Warning: gmmktime() expects parameter 3 to be long, string given in /sti/rss_utils.inc on line 35
Avatar billede jakobdo Ekspert
30. juli 2008 - 21:38 #9
Hvad er linje 35 ?
Avatar billede nightcoder Nybegynder
30. juli 2008 - 21:43 #10
function parse_w3cdtf ( $date_str ) {
   
    # regex to match wc3dtf
    $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
   
    if ( preg_match( $pat, $date_str, $match ) ) {
        list( $year, $month, $day, $hours, $minutes, $seconds) =
            array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[6]);
       
        # calc epoch for current date assuming GMT
  35 >> $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);
       
        $offset = 0;
        if ( $match[10] == 'Z' ) {
            # zulu time, aka GMT
        }
        else {
            list( $tz_mod, $tz_hour, $tz_min ) =
                array( $match[8], $match[9], $match[10]);
           
            # zero out the variables
            if ( ! $tz_hour ) { $tz_hour = 0; }
            if ( ! $tz_min ) { $tz_min = 0; }
       
            $offset_secs = (($tz_hour*60)+$tz_min)*60;
           
            # is timezone ahead of GMT?  then subtract offset
            #
            if ( $tz_mod == '+' ) {
                $offset_secs = $offset_secs * -1;
            }
           
            $offset = $offset_secs;
        }
        $epoch = $epoch + $offset;
        return $epoch;
    }
    else {
        return -1;
    }
}

?>
Avatar billede nightcoder Nybegynder
30. juli 2008 - 21:58 #11
Tror jeg har fået det til at virke nu, men den viser 30 feeds hvis jeg indtaster 2 kilder istedet for de 15.
Avatar billede jakobdo Ekspert
30. juli 2008 - 22:00 #12
Jep, den tager 15 fra hver.
Enten skal du slice på output til sidst.
Avatar billede nightcoder Nybegynder
30. juli 2008 - 22:09 #13
Hvordan gør jeg det?
Avatar billede nightcoder Nybegynder
31. juli 2008 - 07:18 #14
Har fundet et anden class på simplepie.org som har alt hvad man kunne ønske sig :-) Takker for hjælpen smid nogle svar..
Avatar billede jakobdo Ekspert
31. juli 2008 - 09:55 #15
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester