Я довольно новичок в iOS и пытаюсь выполнить запрос REST и получить некоторые XML-данные, проанализировать их и, в идеале, разместить в пользовательском объекте. Но на данный момент я застрял в получении XML-данных.Анализ XML с AFNetworking
Я нашел этот фрагмент кода на Github/AFNetworking ..
- (void) fetchInterestData{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFXMLResponseSerializer new];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
Он работает и получает объект JSON. Но я хочу получить XML.
Если я использую http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=xml, вместо этого есть объект xml. Но теперь код полностью разрушается. Я надеялся хотя бы получить xml как строковый объект.
Что мне нужно изменить, чтобы принести XML и предположительно, я хочу принести XML-объект следующей структуры:
<RootNode>
<Banks>
<Bank>
<BankId>17</BankId>
<BankName>Bluestep</BankName>
<BankUrl>http://www.bluestep.se</BankUrl>
<BankImage>
http://smartkalkyl.se/smartfiles/layout/banklogos/bluestep.png
</BankImage>
<Rates>
<Rate>
<RateDate>2013-12-05</RateDate>
<RateType>5</RateType>
<RateInterest>6,23</RateInterest>
<RateDescription/>
<RateBefore>6,27</RateBefore>
<RateChange>False</RateChange>
<RateBeforeDate>2013-08-13</RateBeforeDate>
</Rate>
</Rates>
</Bank>
<Bank>
...
Как я могу сделать это?
UPDATE: Новый код ..
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer * requestSerializer = [AFHTTPRequestSerializer serializer];
NSString *ua = @"Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25";
[requestSerializer setValue:ua forHTTPHeaderField:@"User-Agent"];
[requestSerializer setValue:@"application/xml" forHTTPHeaderField:@"Content-type"];
manager.requestSerializer = requestSerializer;
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://smartkalkyl.se/rateapp.aspx?user=xxxx&pass=xxx"
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSData * data = (NSData *)responseObject;
self.fetchedXML = [NSString stringWithUTF8String:[data bytes]];
//NSLog(@"Response string: %@", self.fetchedXML);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Но это дает мне ошибку ..
2013-12-06 00:04:10.657 TabbedDemo[38335:a0b] Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/xml" UserInfo=0x8d80ac0 {NSErrorFailingURLKey=http://smartkalkyl.se/rateapp.aspx?user=xxxx&pass=xxxx, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x8a75230> { URL: http://smartkalkyl.se/rateapp.aspx?user=xxxx&pass=xxxx } { status code: 200, headers {
"Cache-Control" = private;
"Content-Encoding" = deflate;
"Content-Length" = 1260;
"Content-Type" = "text/xml; charset=iso-8859-1";
Date = "Thu, 05 Dec 2013 23:03:47 GMT";
Server = "Microsoft-IIS/7.5";
"Set-Cookie" = "ASP.NET_SessionId=ad3zikxbh4bcawxulkhwt2j3; path=/; HttpOnly";
"X-AspNet-Version" = "4.0.30319";
"X-Powered-By" = "UrlRewriter.NET 2.0.0, ASP.NET";
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/xml}
Любая идея, что может быть проблема?
Я делаю аналогичную операцию в Android-версии приложения, и это код, который работает там и работает. Я никогда не ставил любой тип контента там ..
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpProtocolParams.setUserAgent(httpClient.getParams(),
System.getProperty("http.agent"));
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
Ну, вы не должны предполагать AFN является XML-парсер, или JSON парсер. Есть только некоторые удобные функции, такие как «Серийный отладчик JSON Response», который строго не требуется, чтобы быть частью сетевой библиотеки. Вы можете выполнить эту же функцию JSON Serializer с несколькими строками кода. Анализ XML более сложный, но вы можете написать собственный XML-сериализатор или использовать «встроенный» 'AFXMLParserResponseSerializer', если это соответствует вашим потребностям. – CouchDeveloper
Разбор XML - это моя вторичная цель. Первоначально я просто хочу получить XML с сервера в виде строки или аналогичной. –