Jump to content

Parsing RSS feeds where allow_url_fopen=OFF


warpdesign

Recommended Posts

My host turns allow_url_fopen to off for security reasons :( I used to parse RSS feeds just using

$doc = new DOMDocument(); //start new DOM

$doc->load( 'http://feedURLgoeshere ); //load XML file into the DOM

 

Which I can't do now. I have a replacement method using CURL from my host but it literally takes five minutes to load the page if it even works:

 

function My_simplexml_load_file($URL){ 
  
  $ch = curl_init($URL);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);

  $xml = simplexml_load_string(curl_exec($ch));

  curl_close($ch);

  return $xml;
}


function showFeed($URL){
  $xml = My_simplexml_load_file($URL);
  $i = 1;
  foreach( $xml->channel->item as $item ){ 
  	
if ($i <= 5){
  	echo "<li><a href=\"".trim($item->link)."\" >".htmlspecialchars(trim($item->title))."</a></li>\n";
	//echo "hi<br>\n";
	}
$i++;
}
}

showFeed('http://digg.com/rss/index.xml');

 

I'm not sure if it's because CURL is inefficient or if the code is not written right. I'm sure there's a better way than this.

To "get" the xml data use curl, rest, or soap.

If you want to parse it try

SimpleXML, Expat, or XMLDom.  However I don't personally recommend any of the

three.

I recommend googling (xml->array) for php.

In fact I put the data here for you.  As well as an example on some stuff I did in my spare time

with amazon services.

XML Class

<?php
/*

XML Parser Class
by Eric Rosebrock
http://www.phpfreaks.com

Class originated from: [email protected] AT: http://www.devdump.com/phpxml.php

Usage:

<?php
include 'clsParseXML.php';

$xmlparse = &new ParseXML;
$xml = $xmlparse->GetXMLTree('/path/to/xmlfile.xml');

echo "<pre>";
print_r($xml);
echo "</pre>";
?>

The path to the XML file may be a local file or a URL.
Returns the elements of the XML file into an array with
it's subelements as keys and subarrays.

*/

class ParseXML{
      function GetChildren($vals, &$i) {
         $children = array(); // Contains node data
         if (isset($vals[$i]['value'])){
            $children['VALUE'] = $vals[$i]['value'];
         }

         while (++$i < count($vals)){
            switch ($vals[$i]['type']){

            case 'cdata':
               if (isset($children['VALUE'])){
                  $children['VALUE'] .= $vals[$i]['value'];
               } else {
                  $children['VALUE'] = $vals[$i]['value'];
               }
            break;

            case 'complete':
               if (isset($vals[$i]['attributes'])) {
                  $children[$vals[$i]['tag']][]['ATTRIBUTES'] = $vals[$i]['attributes'];
                  $index = count($children[$vals[$i]['tag']])-1;

                  if (isset($vals[$i]['value'])){
                     $children[$vals[$i]['tag']][$index]['VALUE'] = $vals[$i]['value'];
                  } else {
                     $children[$vals[$i]['tag']][$index]['VALUE'] = '';
                  }
               } else {
                  if (isset($vals[$i]['value'])){
                     $children[$vals[$i]['tag']][]['VALUE'] = $vals[$i]['value'];
                  } else {
                     $children[$vals[$i]['tag']][]['VALUE'] = '';
                  }
               }
            break;

            case 'open':
               if (isset($vals[$i]['attributes'])) {
                  $children[$vals[$i]['tag']][]['ATTRIBUTES'] = $vals[$i]['attributes'];
                  $index = count($children[$vals[$i]['tag']])-1;
                  $children[$vals[$i]['tag']][$index] = array_merge($children[$vals[$i]['tag']][$index],$this->GetChildren($vals, $i));
               } else {
                  $children[$vals[$i]['tag']][] = $this->GetChildren($vals, $i);
               }
            break;

            case 'close':
               return $children;
         }
      }
   }

      function GetXMLTree($xmlloc){
         if (file_exists($xmlloc)){
            $data = implode('', file($xmlloc));
         } else {
            $fp = fopen($xmlloc,'r');
            while(!feof($fp)){
               $data = $data . fread($fp, 1024);
            }

            fclose($fp);
         }

         $parser = xml_parser_create('ISO-8859-1');
         xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
         xml_parse_into_struct($parser, $data, $vals, $index);
         xml_parser_free($parser);

         $tree = array();
         $i = 0;

         if (isset($vals[$i]['attributes'])) {
            $tree[$vals[$i]['tag']][]['ATTRIBUTES'] = $vals[$i]['attributes'];
            $index = count($tree[$vals[$i]['tag']])-1;
            $tree[$vals[$i]['tag']][$index] =  array_merge($tree[$vals[$i]['tag']][$index], $this->GetChildren($vals, $i));
         } else {
            $tree[$vals[$i]['tag']][] = $this->GetChildren($vals, $i);
         }
      return $tree;
      }
}

Example

<?php
require_once("./amazon.class.php");
require_once("./xml.class.php");
// request 1
$amazon = new AmazonECS_Item;
$results = $amazon->ItemSearch('psychic', 'All', 'Medium');
$fp = fopen('temp.xml', 'w');
fwrite($fp, $results);
fclose($fp);
$xmlparse = &new ParseXML;
$xml = $xmlparse->GetXMLTree('temp.xml');
// second request
$amazon = new AmazonECS_Item;
$results = $amazon->ItemSearch('paranormal', 'All', 'Medium');
$fp = fopen('temp.xml', 'w');
fwrite($fp, $results);
fclose($fp);
$xmlparse = &new ParseXML;
$xml2 = $xmlparse->GetXMLTree('temp.xml');

//echo '<pre>';
//echo print_r($xml);
//echo '</pre>';
//exit;
?>

After that you'll have yourself an array that's easier than straight parsing xml.

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.