simplexml_load_file not loading [duplicate]

▼魔方 西西 提交于 2019-12-12 03:02:38

问题


This link to an rss feed doesn't load with simplexml_load_file.

  • Link: http://www.nationnews.com/site/feed

The link is a valid RSS feed and no it isn't a permission problem everything else loads.


回答1:


First of all you need to enable error logging and/or reporting to find out more. Also you can check some parameters from the return value and the remote request:

$result = simplexml_load_file($url);

var_dump($result, $http_response_header);

This will tell you that loading failed, the error messages tell you why it failed:

PHP Warning: simplexml_load_file(): http://www.nationnews.com/site/feed/:1: parser error : Start tag expected, '<' not found in /example.php on line 10
PHP Warning: simplexml_load_file(): in /example.php on line 10
PHP Warning: simplexml_load_file(): ^ in /example.php on line 10

And the $http_response_header also show you the picture what has been returned from that host:

array(23) {
  [0]=> string(15) "HTTP/1.0 200 OK"
  [1]=> string(35) "Date: Wed, 20 Feb 2013 10:56:11 GMT"
  [2]=> string(30) "Server: Apache/2.2.15 (CentOS)"
  [3]=> string(23) "X-Powered-By: PHP/5.3.3"
  [4]=> string(56) "Set-Cookie: PHPSESSID=qeaq20mrvrc2u4c403sou6oro2; path=/"
  [5]=> string(38) "Expires: Wed, 20 Feb 2013 08:13:01 GMT"
  [6]=> string(50) "Cache-Control: no-store, no-cache, must-revalidate"
  [7]=> string(16) "Pragma: no-cache"
  [8]=> string(84) "Set-Cookie: exp_last_visit=1046015771; expires=Thu, 20-Feb-2014 10:56:11 GMT; path=/"
  [9]=> string(87) "Set-Cookie: exp_last_activity=1361375771; expires=Thu, 20-Feb-2014 10:56:11 GMT; path=/"
  [10]=> string(89) "Set-Cookie: exp_tracker=a%3A1%3A%7Bi%3A0%3Bs%3A11%3A%22%2Fsite%2Ffeed%2F%22%3B%7D; path=/"
  [11]=> string(44) "Last-Modified: Wed, 20 Feb 2013 07:13:01 GMT"
  [12]=> string(40) "Cache-Control: post-check=0, pre-check=0"
  [13]=> string(21) "Vary: Accept-Encoding"
  [14]=> string(16) "imagetoolbar: no"
  [15]=> string(17) "Connection: close"
  [16]=> string(37) "Content-Type: text/xml; charset=utf-8"
  [17]=> string(76) "Set-Cookie: cookiesession1=HTEVZV0HJNK2HARUL2QBDADH8RXYESJB;Path=/;HttpOnly "
  [18]=> string(109) "Set-Cookie: exp_last_visit_cookiesession2=tSzDt6/k20k=;Expires=Thu, 20-Feb-2014 10:56:11 GMT;Path=/;HttpOnly "
  [19]=> string(112) "Set-Cookie: exp_last_activity_cookiesession2=e+FVcqI8+Ck=;Expires=Thu, 20-Feb-2014 10:56:11 GMT;Path=/;HttpOnly "
  [20]=> string(68) "Set-Cookie: exp_tracker_cookiesession2=w+13lT4TxY0=;Path=/;HttpOnly "
  [21]=> string(22) "Content-Encoding: gzip"
  [22]=> string(20) "content-length: 2463"
}

According to the HTTP specs that you make use of by using a HTTP uri, the content encoding is:

[21]=> string(22) "Content-Encoding: gzip"

This is not supported by PHP out of the box with it's HTTP Wrapper so you need to work around that your own

For example by using the zlib Stream Wrapper::

$result = simplexml_load_file('compress.zlib://' . $url);

Or with the help of the gzdecode function:

$result = simplexml_load_string(gzdecode(file_get_contents($url)));

Full example code with all the variants:

$url = 'http://www.nationnews.com/site/feed/';


// stream wrapper:

$result = simplexml_load_file('compress.zlib://' . $url);

var_dump($result, $http_response_header);


// gzdecode:

$result = simplexml_load_string(gzdecode(file_get_contents($url)));

var_dump($result, $http_response_header);


// none (the error case):

$result = simplexml_load_file($url);

var_dump($result, $http_response_header);

Related Questions:

  • Uncompress a gzip file from CURL, on php
  • Uncompress gzip compressed http response
  • PHP: Call to undefined function gzdecode()

And the following PHP Bugreports are related (just picked some, this is likely not complete):

  • Bug #52926 - stream_context_set_default() does not work as intended with stream chaining (26 Sep 2010)
  • Bug #47925 - PHPClient can't decompress response (transposed uncompress methods?) (8 Apr 2009)
  • Doc Bug #29045 - gzopen for URL (7 Jul 2005)
  • Request #28051 - gzip accept-encoding for HTTP request (19 Apr 2004)



回答2:


The rss feed is gziped. This should do the trick:

$content =  file_get_contents("http://www.nationnews.com/site/feed/");
$rss = simplexml_load_string(gzinflate(substr($content,10,-8)));

See PHP: Call to undefined function gzdecode() for further details regarding the gzinflate.



来源:https://stackoverflow.com/questions/14969481/simplexml-load-file-not-loading

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!