Как я могу скачать с помощью PHP файл XML, перенаправленный каким-то странным образом? - PullRequest
3 голосов
/ 12 мая 2011

Файл, который я пытаюсь загрузить из моего 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);

Ответы [ 2 ]

5 голосов
/ 12 мая 2011

Вам не нужно cURL или file_get_contents для загрузки XML в любой из PHP DOM-основанных парсеров XML .

Однако, в вашем конкретном случае проблема заключается в том, что сервер ожидает агента пользователя в запросе 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();

Live Demo

Если вы не хотите впоследствии разбирать 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'            
            )
        )
    )
);

Live Demo

0 голосов
/ 26 мая 2011

Я использовал решение, данное для @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 отключен в конфигурации сервера в , поэтому я изменил все 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;
}

Как вы думаете, это хороший подход?

Спасибо, Пабло.

...