2011-10-13 314 views
0

我有一個iOS應用程序正在調用Web服務的一些XML數據,例如:的NSXMLParser initWithContentsOfURL - 解析gzip壓縮響應

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
[xmlParser setDelegate:self]; 
[xmlParser setShouldProcessNamespaces:NO]; 
[xmlParser setShouldReportNamespacePrefixes:NO]; 
[xmlParser setShouldResolveExternalEntities:NO];   
[xmlParser parse]; 

我一直得到一個錯誤:

Error parsing XML: The operation couldn’t be completed. 
(NSXMLParserErrorDomain error 31.) 

錯誤31是「NSXMLParserUnknownEncodingError」。我在WireShark中嗅探了HTTP響應,結果發現Web服務正在發送帶有GZIP數據的「Content-Encoding:gzip」,其原因是因爲從iOS發送的請求設置了「Accept-Encoding :gzip,deflate「在HTTP標頭中。似乎initWithContentsOfURL告訴它可以處理gzip的數據時,它實際上不能。

我猜我需要加載Web服務器響應到NSData中,然後通過解壓縮方法運行它以獲取NSString,然後將該字符串傳遞給NSXMLParser。

我的問題是,做這個解壓縮的最好方法是什麼? zlib的?從iOS內部鏈接到ZLib的任何問題?

謝謝
有狀態

附:我用osx標記了這一點,因爲我想這個問題也會出現在那裏,因爲NSXMLParser是一個基礎類。

回答

1

使用NSURLConnection委託方法從webservice下載響應。然後將數據傳遞給NSXMLParser initWithContentsOfData。 通過使用NSURLConnection委託方法(異步連接),您不會阻止當前線程。這是推薦的下載響應方式。 Plus NSURLConnection解壓縮(壓縮)g-zip壓縮響應。你不需要做任何特殊的事情來減壓。 在將數據提供給NSXMLParser(Thanks Steven)之前,您可以檢查數據。

使用NSXMLParser initWithContentsOfURL應該主要用於解析應用程序中的XML文件(在資源或文檔部分中)。它肯定會與您的web服務進行連接以下載響應,但它相當於同步調用並阻止您的線程。 避免NSURLConnection sendSynchronous和initWithContentsOfURL傳遞遠程Web服務URL。

+0

您可能想要以異步方式添加額外的好處:在將數據發送到NSXMLParser之前,您將能夠檢查數據。這可能是錯誤的地方。 –

+0

感謝Nikita和Steven的出色和快速反應。 – Stateful

0

NSURLConnection自動處理gzip解壓縮(即下載)。 iOS特別要求HTTP頭中的gzip內容。它可以處理它。

但是,同步網絡事務是一個問題。相反,您應該使用異步請求來獲取數據。數據完成後,您可以將其傳遞至NSXMLParser。另一個好處是你可以檢查數據,你可能發現這些數據並不是真正的XML。

作爲一個快速破解看看發生了什麼,我相信有一個NSData方法同步從URL下載。那個數據實例可以被送到NSXMLParser。但這是一個臨時修復。您不想在應用程序中留下任何同步網絡;如果花費太長時間,監督人員會殺死你的應用程序。但它可能會指出你的XML有什麼問題。