0

我正在尝试使用 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

4 回答 4

0

您需要通过以下方式传递字符串gzuncompresshttp ://www.php.net/manual/en/function.gzuncompress.php

于 2013-07-07T06:32:36.863 回答
0

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

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

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

注意php提供了两个类似的函数:

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

于 2013-07-07T06:39:09.663 回答
0

您首先需要将文件保存到磁盘。由于它是 gz 压缩的,因此您需要先解压缩它,然后才能访问(未压缩的)XML。这可以通过zlib:// -- bzip2:// -- zip:// -- PHP 中的压缩流来完成:

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

要使其工作,您需要安装/配置 ZLib 扩展

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

另见:

于 2013-07-07T07:14:29.260 回答
0

不知道为什么,但最终没有其他答案对我有用。zlib 安装在服务器上,但是库中没有定义 gzdecode() 函数,gzuncompress 给了我错误,compress.zlib:// 也是如此。他们可能对你有用,所以也试试看。

如果您需要检查 zlib 是否安装了这个stackoverflow 答案或者这个答案可以提供帮助。他们提供了这个脚本:

<?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 ";
}

?>

该站点提供了另一个脚本,显示了已安装的 zlib 函数:

var_dump(get_extension_funcs('zlib'));

解决方案!!!这两个功能对我有用。只需 curl 或使用 file_get_contents 获取 xml 文件,然后使用此脚本:

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

或使用此脚本来获取 xml 文件并获取内容(在此处查看更多信息):

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

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

于 2013-07-08T02:58:33.650 回答