使用AFNetworking解析XML [英] Parsing XML with AFNetworking

查看:136
本文介绍了使用AFNetworking解析XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对iOS很新,并且正在尝试执行REST请求并获取一些XML数据,解析它并理想地放入自定义对象。但是现在我对获取XML数据感到困惑。

I am fairly new with iOS and is trying to do a REST request and fetch some XML data, parse that and ideally put into a custom Object. But for now I am stuck with the getting XML data.

我在Github / AFNetworking上找到了这段代码..

I found this code snippet on 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 ..

It works and fetches a JSON object. But I want to get the XML..

如果我使用 http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=xml 而是有一个xml对象。但现在代码完全崩溃了。我希望至少将xml作为一个字符串对象。

If I use http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=xml instead there is an xml object. But now the code breaks down completely. I was hoping to at least get the xml as a string object.

我需要更改以获取xml并假设我想要获取一个xml对象结构:

What do I need to change to fetch the xml and assumingly I want to fetch a xml object of following structure:

<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>
   ...

我该怎么做?

更新:新代码..

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);
}];

但是这给了我一个错误..

But this gives me an 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}

知道可能出现什么问题吗?

Any idea what could be the problem?

我在应用程序的Android版本中进行类似的操作,这是在那里工作的代码。我从来没有在那里设置任何内容类型..

I am doing similar operation in the Android version of the app and this is the code that works there and that work. I never set any content type there..

// 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);


推荐答案

根据您更新的代码,您需要添加一个响应序列化器,你还需要正确翻译NSData:

Based on your updated code, you need to add a response serializer, and you also need to translate the NSData properly:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer * requestSerializer = [AFHTTPRequestSerializer serializer];
AFHTTPResponseSerializer * responseSerializer = [AFHTTPResponseSerializer 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"];
responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/xml", nil];
manager.responseSerializer = responseSerializer;
manager.requestSerializer = requestSerializer;

NSDictionary *parameters = @{@"foo": @"bar"};

[manager POST:@"http://smartkalkyl.se/rateapp.aspx?user=xxxxx&pass=xxxxxx"
   parameters:parameters
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSData * data = (NSData *)responseObject;
          self.fetchedXML = [NSString stringWithCString:[data bytes] encoding:NSISOLatin1StringEncoding];
          NSLog(@"Response string: %@", self.fetchedXML);
      }
      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"Error: %@", error);
      }];

您的响应将以text / xml的形式返回,并且默认响应序列化程序需要设置为接受那个。

Your response is coming back as text/xml, and the default response serializer needs to be set to accept that.

数据不是以UTF8而是以ascii的形式返回,所以我们也需要适当地设置。

The data isn't coming back as UTF8 but ascii, so we need to set that appropriately as well.

我在模拟器中给了它一个镜头,它正在我的结束。

I gave it a shot in the simulator and it's working on my end.

编辑:似乎数据是ISO latin-1格式。我的坏。

edit: seems the data is in ISO latin-1 format. my bad.

这篇关于使用AFNetworking解析XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆