我打算做一個iPhone搜索應用程序。用戶鍵入搜索字符串。該字符串將被谷歌,Live,雅虎等搜索引擎搜索...如何獲得XML格式的搜索結果
我需要以XML格式獲取搜索結果。有沒有辦法做到這一點。需要幫助。請。
感謝和問候, 世斌
我打算做一個iPhone搜索應用程序。用戶鍵入搜索字符串。該字符串將被谷歌,Live,雅虎等搜索引擎搜索...如何獲得XML格式的搜索結果
我需要以XML格式獲取搜索結果。有沒有辦法做到這一點。需要幫助。請。
感謝和問候, 世斌
A RESTful search request to Google AJAX返回格式爲JSON的響應。 JSON就像是一個非常精簡的XML版本。
谷歌不再提供它的SOAP接口,所以我不知道你是否能夠從他們那裏獲取XML,至少通過公共接口。幸運的是,JSON響應對請求和在iPhone上解析是微不足道的。
您可以使用ASIHTTPRequest發出請求,並使用json-framework解析iPhone上的JSON格式的響應。
例如,創建和提交是基於谷歌AJAX頁面上的例子一個搜索請求,您可以使用ASIHTTPRequest的-requestWithURL
和-startSynchronous
方法:
NSURL *searchURL = [NSURL URLWithString:@"http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton"];
ASIHTTPRequest *googleRequest = [ASIHTTPRequest requestWithURL:searchURL];
[googleRequest addRequestHeader:@"Referer" value:[self deviceIPAddress]];
[googleRequest startSynchronous];
你會建立一個基於該NSURL
實例您的搜索字詞,escaping的請求參數。
如果我按照谷歌的例子來寫這封信,我還會在這個URL中添加一個API密鑰。 Google要求您使用API密鑰進行REST搜索。您應註冊API密鑰over here並將其添加到您的請求中。
你也應該指定請求頭中的引用者的IP地址,在這種情況下將是iPhone的本地IP地址,例如:
- (NSString *) deviceIPAddress {
char iphoneIP[255];
strcpy(iphoneIP,"127.0.0.1"); // if everything fails
NSHost *myHost = [NSHost currentHost];
if (myHost) {
NSString *address = [myHost address];
if (address)
strcpy(iphoneIP, [address cStringUsingEncoding:NSUTF8StringEncoding]);
}
return [NSString stringWithFormat:@"%s",iphoneIP];
}
也有異步請求的方法,這是在詳細ASIHTTPRequest文檔。您可以使用這些功能來防止在執行搜索請求時iPhone綁定。
在任何情況下,一旦你手中有谷歌的JSON格式的響應,您可以使用JSON框架SBJSON
解析器對象解析響應爲NSDictionary
對象:
NSError *requestError = [googleRequest error];
if (!requestError) {
SBJSON *jsonParser = [[SBJSON alloc] init];
NSString *googleResponse = [googleRequest responseString];
NSDictionary *searchResults = [jsonParser objectWithString:googleResponse error:nil];
[jsonParser release];
// do stuff with searchResults...
}
有不同的Web服務API的使用。我會建議你使用這些。
谷歌搜索API:http://code.google.com/intl/sv-SE/apis/ajaxsearch/web.html
谷歌JS API的經常回JSON。但是,這也很容易。如果需要,您應該可以輕鬆地將JSON轉換爲XML。
這是沒有這麼多一個關於iPhone的問題,但更多的是Google,Live,Yahoo的API功能。如果你想在iPhone上輕鬆顯示結果,你最好的選擇就是屏幕刮擦。如果你想合併結果,屏幕抓取並將詳細信息放入SQLite數據庫,然後在數據庫中對它們進行排序。 – Rudiger 2010-05-18 08:53:04
@Rudiger:你能說一些關於屏幕刮擦的東西嗎? – smakstr 2010-05-18 08:55:15
JUst使用NSURLConnection獲取網頁,然後使用div標籤和NSScanner從div標籤中過濾出信息。我會推薦至少使用像Google API這樣的東西。如果雅虎沒有一個,你想得到它,你將被迫屏幕刮,併成爲他們的重新設計的奴隸打破你的代碼 – Rudiger 2010-05-18 08:59:18