Simple RSS parser

Discussion in 'PHP' started by oktar, Aug 11, 2006.

  1. #1
    This is simple RSS parser and works fine. However it doesn't have possibility to set how many article header parse. Any ideas how to do it?

    <?php
    $insideitem = false;
    $tag = "";
    $title = "";
    $description = "";
    $link = "";
    function startElement($parser, $name, $attrs) {
     global $insideitem, $tag, $title, $description, $link;
     if ($insideitem) {
      $tag = $name;
     } elseif ($name == "ITEM") {
      $insideitem = true;
     }
    }
    function endElement($parser, $name) {
     global $insideitem, $tag, $title, $description, $link;
     if ($name == "ITEM") {
      printf("<dt><b><a href='%s'>%s</a></b></dt>",
      trim($link),htmlspecialchars(trim($title)));
      printf("<dt>%s</dt><br><br>",htmlspecialchars(trim($description)));
      $title = "";
      $description = "";
      $link = "";
      $insideitem = false;
     }
    }
    function characterData($parser, $data) {
     global $insideitem, $tag, $title, $description, $link;
     if ($insideitem) {
     switch ($tag) {
      case "TITLE":
      $title .= $data;
      break;
      case "DESCRIPTION":
      $description .= $data;
      break;
      case "LINK":
      $link .= $data;
      break;
     }
     }
    }
    $xml_parser = xml_parser_create();
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");
    $fp = fopen("http://sports.yahoo.com/rss.xml","r")
     or die("Error reading RSS data.");
    while ($data = fread($fp, 4096))
     xml_parse($xml_parser, $data, feof($fp))
      or die(sprintf("XML error: %s at line %d",
       xml_error_string(xml_get_error_code($xml_parser)),
       xml_get_current_line_number($xml_parser)));
    fclose($fp);
    xml_parser_free($xml_parser);
    ?>
    Code (markup):
    Some person suggested me to change

    while ($data = fread($fp, 4096))
     xml_parse($xml_parser, $data, feof($fp))
      or die(sprintf("XML error: %s at line %d",
       xml_error_string(xml_get_error_code($xml_parser)),
       xml_get_current_line_number($xml_parser)));
    Code (markup):
    to

    $the_max_counter = 14;
    $the_counter = 0;
    while ($data = fread($fp, 4096) && $the_counter < $the_max_counter ) {
    $the_counter++;
    xml_parse($xml_parser, $data, feof($fp))
    or die(sprintf("XML error: %s at line %d",
    xml_error_string(xml_get_error_code($xml_parser)),
    xml_get_current_line_number($xml_parser)));
    }
    
    Code (markup):
    However it doesn't work. My browser says XML error: syntax error at line 1
     
    oktar, Aug 11, 2006 IP
  2. sarahk

    sarahk iTamer Staff

    Messages:
    28,998
    Likes Received:
    4,577
    Best Answers:
    124
    Trophy Points:
    665
    #2
    try using simplepie or magpie rss
     
    sarahk, Aug 11, 2006 IP
  3. Lightning-Software

    Lightning-Software Well-Known Member

    Messages:
    204
    Likes Received:
    5
    Best Answers:
    0
    Trophy Points:
    110
    #3
    I love magpierss, works great for me.
     
    Lightning-Software, Aug 11, 2006 IP
  4. ablaye

    ablaye Well-Known Member

    Messages:
    4,024
    Likes Received:
    97
    Best Answers:
    0
    Trophy Points:
    150
    #4
    It is possible that the rss feeds you are trying to read have some XML errors (possibly due to illegal characters in one of the fields).
     
    ablaye, Aug 11, 2006 IP