2013-07-07 34 views
0

我试图从curl的xml.gz文件中获取数据。我可以下载该文件,但无法获得可用的XML。当我尝试打印的XML,我得到的乱码特殊字符,如一个长长的清单:使用curl获取gzipped XML文件的问题PHP

‹ì½û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

小心:gzip是_not_ zip,所以“unzip”是错误的方法... – arkascha

+0

谢谢。我在解释中的错误。现在更正。 – David

+0

那么反对使用现有的PHP函数解压它呢?无论是'gzdecode'(http://www.php.net/manual/de/function.gzdecode.php)还是'gzuncompress',取决于结果的实际编码方式。 – arkascha

回答

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); 

谢谢给所有帮助我的人得到这个答案。希望这可以帮助别人!

0

我建议你刚才解压缩的结果你获取:

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

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

注意,有由PHP提供了两个类似的功能:

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

+0

我试过了,但也收到了一个未定义的函数错误。我猜我需要为此安装一个PHP库?我在PHP 5上,所以我猜想它应该是默认的。 – David

+0

大多数PHP函数都是由扩展提供的,并不是所有这些函数都必须安装在由发行版定义的php模式中。检查您的软件管理系统并安装“Zlib”php扩展(在openSUSE上称为“php5-zlib”,在其他发行版中可能略有不同)。 – arkascha

+0

那么,我检查了php.ini文件,并在服务器上做了一个测试。它显示Zlib已安装并处于活动状态,但仍然没有gzdecode功能。网上的其他人似乎也显示了这一点。我确实发现'gzinflate(substr(curl_exec($ ch),10,-8));'会给我这个xml的内容,但它似乎去掉了xml格式。 'gzread'从这个解决方案[链接](http://stackoverflow.com/questions/9768237/php-gzuncompress-with-file-read-and-write-errors)做了同样的事情。 – David

0

您首先需要将文件保存到磁盘。由于它是gz压缩的,所以在访问(未压缩的)XML之前,需要对它进行解压缩。这可以用PHP的zlib:// -- bzip2:// -- zip:// — Compression Streams来完成:

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

为了得到这个工作,你需要有ZLib extension installed/configured

包装意味着您并未首先创建该文件的未压缩变体(也可以创建第二个文件,该文件也可以是解决方案),但包装将动态透明地解压缩该文件的数据,以便simplexml库可以在未压缩的XML上运行(这就是该库所需的:未压缩的XML)。

看得那么清楚: