2011-10-13 148 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有什么问题。