2013-07-07 36 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)。

看得那麼清楚: