我正在尝试使用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);
感谢您的帮助!
答案 0 :(得分:0)
您需要将字符串传递给gzuncompress
:http://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 answer或this 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);
感谢所有帮助我得到这个答案的人。希望这有助于其他人!