如何使用PHP下载以某种奇怪方式重定向的XML文件?

如何使用PHP下载以某种奇怪方式重定向的XML文件?,php,xml,curl,file-get-contents,Php,Xml,Curl,File Get Contents,我试图从PHP脚本下载的文件如下: http://www.navarra.es/appsext/DescargarFichero/default.aspx?codigoAcceso=OpenData&fichero=Farmacias/Farmacias.xml 但是我既不能使用file\u get\u contents()也不能使用cURL。我得到的错误对象引用未设置为对象的实例。 知道怎么做吗 非常感谢,巴勃罗 已更新以添加代码: $url = "http://www.navar

我试图从PHP脚本下载的文件如下:

http://www.navarra.es/appsext/DescargarFichero/default.aspx?codigoAcceso=OpenData&fichero=Farmacias/Farmacias.xml 
但是我既不能使用
file\u get\u contents()
也不能使用
cURL
。我得到的错误
对象引用未设置为对象的实例。

知道怎么做吗

非常感谢,巴勃罗

已更新以添加代码:

$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\u get\u contents
将XML加载到任何文件中

但是,在您的特定情况下,问题似乎是服务器希望http请求中有一个用户代理。如果php.ini中未设置用户代理,则可以使用并将其作为:

如果以后不想解析XML文件,也可以使用
file\u get\u 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文件访问在中的服务器配置中被禁用,因此我更改了我发现的此代码的所有
文件内容()

你认为这是一个好方法吗


谢谢,Pablo。

请显示失败的PHP代码。我已经用代码对其进行了更新。谢谢或者您可以使用
curl_setopt($ch,CURLOPT_USERAGENT,“Googlebot/2.1…”)设置用户代理@是的,那也行。不过,我觉得cURL做这件事太过分了。谢谢@Gordon,它工作得很好。根据您的回答,我理解您建议我使用DOM或XMLReader而不是SimpleXML?@Puigcerber mine只是一个示例=P您可以将用户代理设置为您想要的任何代理,它可以是google bot或mozilla代理=)干杯@用户代理可以是识别请求方的任何东西。它不必是浏览器。请参阅我对和/或RFC1945的回答和/或如果您使用
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1)您不需要缓冲输出。只需执行
$content=curl\u exec()
。再次感谢您的帮助@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);
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;
}