Файл, который я пытаюсь загрузить с моего PHP-скрипта, следующий:
http://www.navarra.es/appsext/DescargarFichero/default.aspx?codigoAcceso=OpenData&fichero=Farmacias/Farmacias.xml
Но я не могу это сделать, используя ни file_get_contents()
ни cURL
. Я получаю ошибку Object reference not set to an instance of an object.
Есть идеи, как это сделать?
Большое спасибо, Пабло.
Обновлен для добавления кода:
$url = "http://www.navarra.es/appsext/DescargarFichero/default.aspx?codigoAcceso=OpenData&fichero=Farmacias/Farmacias.xml"; $simple = simplexml_load_file(file_get_contents($url)); foreach ($simple->farmacia as $farmacia) { var_dump($farmacia); }
И решение благодаря @Gordon:
$url = "http://www.navarra.es/appsext/DescargarFichero/default.aspx?codigoAcceso=OpenData&fichero=Farmacias/Farmacias.xml"; $file = file_get_contents($url, FALSE, stream_context_create(array('http' => array('user_agent' => 'php' )))); $simple = simplexml_load_string($file);
Вам не нужны cURL
или file_get_contents
для загрузки XML в любой из парсеров XML на основе DOM .
Однако в вашем конкретном случае проблема заключается в том, что сервер ожидает пользовательского агента в HTTP-запросе. Если пользовательский агент не установлен в вашем php.ini, вы можете использовать функции libxml и предоставить его как контекст потока :
libxml_set_streams_context( stream_context_create( array( 'http' => array( 'user_agent' => 'php' ) ) ) ); $dom = new DOMDocument; $dom->load('http://www.navarra.es/app…/Farmacias.xml'); echo $dom->saveXml();
Демо-версия
Если после этого вы не захотите анализировать XML-файл, вы также можете использовать file_get_contents
. Вы можете передать контекст потока в качестве третьего аргумента:
echo file_get_contents( 'http://www.navarra.es/apps…/Farmacias.xml', FALSE, stream_context_create( array( 'http' => array( 'user_agent' => 'php' ) ) ) );
Демо-версия
Я использовал решение, данное для @Gordon, и он отлично работал в localhost:
$url = "http://www.navarra.es/appsext/DescargarFichero/default.aspx?codigoAcceso=OpenData&fichero=Farmacias/Farmacias.xml"; $file = file_get_contents($url, FALSE, stream_context_create(array('http' =>array('user_agent' => 'php' )))); $simple = simplexml_load_string($file);
Но когда я загрузил все файлы на сервер … неожиданно, как всегда. Я начал получать URL-адрес доступа к URL-адресу ошибки в конфигурации сервера, поэтому я изменил все file_get_contents()
для этого кода, который я нашел здесь :
function get_content($url) { $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_USERAGENT, "Googlebot/2.1..."); ob_start(); curl_exec ($ch); curl_close ($ch); $string = ob_get_contents(); ob_end_clean(); return $string; }
Считаете ли вы, что это хороший подход?
Спасибо, Пабло.