【问题标题】:How can I download using PHP a XML file redirected in some weird way?如何使用 PHP 下载以某种奇怪方式重定向的 XML 文件?
【发布时间】:2011-08-23 22:19:54
【问题描述】:

我试图从我的 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);

【问题讨论】:

  • 请显示您失败的 PHP 代码。
  • 我已经用代码更新了它。谢谢。

标签: php xml curl file-get-contents


【解决方案1】:

我一直在使用为@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-access is disabled in the server configuration in 所以我已经更改了我找到的 here 的所有 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;
}

您认为这是一个好方法吗?

谢谢,巴勃罗。

【讨论】:

  • 如果你使用curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);,你不需要缓冲输出。只需$content = curl_exec()
  • 再次感谢@Gordon 的帮助。
【解决方案2】:

您不需要cURL,也不需要file_get_contents 将XML 加载到任何PHP's DOM Based XML parsers 中。

但是,在您的特定情况下,问题似乎是服务器在 http 请求中需要一个用户代理。如果您的 php.ini 中没有设置用户代理,您可以使用 libxml functions 并将其作为 stream context 提供:

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

【讨论】:

  • .. 或者你可以设置用户代理curl_setopt($ch, CURLOPT_USERAGENT, "Googlebot/2.1...");
  • @please 是的,这也可以。但是,tbh,我发现 cURL 完全是矫枉过正。
  • 感谢@Gordon,它运行良好。根据您的回答,我了解到您建议我使用 DOM 或 XMLReader 而不是 SimpleXML?
  • @Puigcerber mine 只是一个例子 =P 您可以将用户代理设置为您想要的任何代理,可以是 google bot 或 mozilla 代理 =) 干杯!
  • @Puigcerber 用户代理可以是任何标识请求方的东西。它不一定是浏览器。请参阅我对 stackoverflow.com/questions/6002513/… 和/或 RFC1945 和/或 useragentstring.com/pages/PHP 的回答
猜你喜欢
  • 2016-08-18
  • 2015-12-16
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2016-09-26
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多