使用curl PHP获取gzip XML文件的问题

时间:2013-07-07 06:27:25

标签: php xml curl gzip

我正在尝试使用curl从xml.gz文件中获取数据。我可以下载该文件,但无法通过我的任何尝试获得可用的XML。当我尝试打印XML时,我会得到一长串乱码特殊字符,例如:

‹ì½ûrâÈ–7ú?E~{Çž¨Ši°î—Ù5=ÁÍ6]`Ø€ë²ãDLÈ u

有没有一种简单的方法来解压缩和编码这个xml?可能通过SimpleXML?文件很大,需要验证。这是我目前的代码:

$username='username';
$password='password';
$location='http://www.example.com/file.xml.gz';


$ch = curl_init ();
curl_setopt($ch,CURLOPT_URL,$location);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_USERPWD,"$username:$password");
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HEADER, 0);

$xmlcontent = curl_exec ($ch); 
curl_close($ch);

print_r($xmlcontent);

感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

您需要将字符串传递给gzuncompresshttp://www.php.net/manual/en/function.gzuncompress.php

答案 1 :(得分:0)

我建议您解压缩您获取的结果:

//[...]
$xmlcontent = gzdecode ( curl_exec($ch) ); 
curl_close($ch);
print_r($xmlcontent);

显然你应该做一些额外的错误检查,这只是缩短的一般方法。

请注意,php提供了两个类似的功能:

如果文件确实是由http服务器提供的物理gzip压缩文件,则很可能必须使用第二个。

答案 2 :(得分:0)

首先需要将文件保存到磁盘。因为它是gz压缩的,所以在访问(未压缩的)XML之前需要解压缩它。这可以通过PHP中的zlib:// -- bzip2:// -- zip:// — Compression Streams来完成:

$file = 'compress.zlib://file.xml.gz';
         ################
$xml  = simplexml_load_file($file);

要实现这一点,您需要拥有ZLib extension installed/configured

Wrapper意味着您不是首先创建该文件的未压缩变体(创建第二个文件,也可以是解决方案),但包装器会动态地透明地解压缩该文件的数据,以便simplexml库可以对未压缩的XML进行操作(这就是该库需要的:未压缩的XML)。

参见:

答案 3 :(得分:0)

不知道为什么,但最后没有其他答案对我有用。 zlib安装在服务器上,但gzdecode()函数没有在库中定义,gzuncompress给了我错误,就像compress.zlib://一样。他们可能会为你工作,也可以尝试一下。

如果您需要检查zlib是否已安装,stackoverflow answerthis answer可以提供帮助。他们提供了这个脚本:

<?php

echo phpversion().", ";

if (function_exists("gzdecode")) {
  echo "gzdecode OK, ";
} else {
  echo "gzdecode no OK, ";
}

if (extension_loaded('zlib')) {
  echo "zlib extension loaded ";
} else {
  echo "zlib extension not loaded ";
}

?>

This site给出了另一个显示zlib函数安装的脚本:

var_dump(get_extension_funcs('zlib'));

解!!!这两个功能对我来说很有用。只需卷曲或使用file_get_contents来获取xml文件,然后使用此脚本:

$xmlcontent = gzinflate(substr($xmlcontent,10,-8));

或者使用此脚本获取xml文件并获取内容(请参阅更多here):

$zd = gzopen($filename,"r");
$contents = gzread($zd,$fileSize);
gzclose($zd);

感谢所有帮助我得到这个答案的人。希望这有助于其他人!