Changeset 1654

Show
Ignore:
Timestamp:
01/01/2008 09:06:25 PM (12 months ago)
Author:
Shadowhand
Message:

Updated feed::parse() to use SimpleXML instead of DOMDocument.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/system/helpers/feed.php

    r1481 r1654  
    2727                $limit = (int) $limit; 
    2828 
    29                 // Create a DOM parser 
    30                 $parser = new DOMDocument; 
     29                // Disable error reporting while opening the feed 
     30                $ER = error_reporting(0); 
    3131 
    32                 if (is_file($feed)) 
     32                // Allow loading by filename or raw XML string. 
     33                $feed = is_file($feed) ? simplexml_load_file($feed) : simplexml_load_string($feed); 
     34 
     35                // Restore error reporting 
     36                error_reporting($ER); 
     37 
     38                // Feed could not be loaded 
     39                if ($feed === FALSE) 
     40                        return array(); 
     41 
     42                // Detect the feed type. RSS 1.0/2.0 and Atom 1.0 are supported. 
     43                $feed = isset($feed->channel) ? $feed->xpath('//item') : $feed->entry; 
     44 
     45                $i = 0; 
     46                $items = array(); 
     47 
     48                foreach ($feed as $item) 
    3349                { 
    34                         // Load by file 
    35                         $parser->load($feed); 
    36                 } 
    37                 else 
    38                 { 
    39                         // Load XML in the string 
    40                         $parser->loadXML($feed); 
     50                        if ($i++ === $limit) 
     51                                break; 
     52 
     53                        $items[] = (array) $item; 
    4154                } 
    4255 
    43                 // Reset the feed to an empty array 
    44                 $feed = array(); 
    45  
    46                 // Choose the name of the entry (RSS or Atom). Atom feeds use <feed> 
    47                 // as the XML container, RSS uses <rdf>. 
    48                 $entry = ($parser->getElementsByTagName('feed')->length > 0) ? 'entry' : 'item'; 
    49  
    50                 // Parse each of the RSS items 
    51                 foreach($parser->getElementsByTagName($entry) as $index => $node) 
    52                 { 
    53                         if ($limit > 0 AND $index >= $limit) 
    54                                 break; 
    55  
    56                         // Create a new data set 
    57                         $item = array(); 
    58  
    59                         // Get all the of fields in the feed item 
    60                         foreach($node->childNodes as $node) 
    61                         { 
    62                                 // Only add XML element nodes 
    63                                 if ($node->nodeType === XML_ELEMENT_NODE) 
    64                                 { 
    65                                         $item[$node->nodeName] = $node->nodeValue; 
    66                                 } 
    67                         } 
    68  
    69                         // Add the item data to the feed 
    70                         $feed[] = $item; 
    71                 } 
    72  
    73                 return $feed; 
     56                return $items; 
    7457        } 
    7558