2013-11-14 4 views
0

Я знаю, что есть много вопросов, которые были заданы и ответили, а не ответы на мои проблемы.NSXML XML Parsing issue iOS

Я отправляю XML на сервер, и я получаю ответ обратно. Моя проблема заключается в получении указанного ключа из ответа.

Я пытаюсь перечислить всех Гендеров, например, мужчин, женщин и их идентификаторов, однако при анализе XML в текст с помощью NSXML я вернусь только к женщине и ID 2, и я не вернусь к мужчине?

Я исследовал и пытался исправить эту проблему, но безрезультатно.

вот мой код:

- (void)getGender { 

    NSString *soapMessage = [NSString stringWithFormat: 
          @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 
          "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:app=\"http://app.ws.api.bells.wigroup.com/\">" 
          "<soap:Header/>\n" 
          "<soap:Body>\n" 
          "<app:getAllGenders>\n" 
          "<request>\n" 
          "<apiCredentials>\n" 
          "<apiId>IPHONE_APP</apiId>\n" 
          "<sha1Password>8656cafcd71cbbfe773a0fdb6c422666a80e5b8f</sha1Password>\n" 
          "</apiCredentials>\n" 
          "<request>\n" 
          "</request>\n" 
          "</request>\n" 
          "</app:getAllGenders>\n" 
          "</soap:Body>\n" 
          "</soap:Envelope>\n" 
          ]; 
    NSLog(@"Message%@",soapMessage); 

    NSURL *url = [NSURL URLWithString:@"http://qa.wigroup.co:8080/bells/AppWS"]; 
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; 
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; 

    [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    //[theRequest addValue: @"http://" forHTTPHeaderField:@"SOAPAction"]; 
    [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; 
    [theRequest setHTTPMethod:@"POST"]; 
    [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if(theConnection) 
    { 

     NSURLResponse *response; 
     NSError *error; 

     NSData *urlData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error]; 
     NSString *str=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
     NSLog(@"Login response XML:%@",str); 


     // create and init NSXMLParser object 
     XmlArrayParser *parser = [[XmlArrayParser alloc] initWithData:urlData]; 
     parser.rowElementName = @"return"; 
     parser.elementNames = [NSArray arrayWithObjects:@"response", @"responseCode", @"responseDesc", @"gendersList", nil]; 
     parser.attributeNames = [NSArray arrayWithObjects:@"id", @"gender", nil]; 

     if ([parser.rowElementName isEqualToString:@"responseCode"] && _flag) 
     { 
      //read the value here 
      NSLog(@"flagging"); 
     } 

     // parsing... 
     BOOL success = [parser parse]; 

     // test the result 
     if (success) 
     { 
      NSMutableArray *loginAuth = [parser items]; 

      //  self.textView.text = [NSString stringWithFormat: 
      //  @"This is an array of dictionaries, one dictionary for each user:\n\n%@", 
      //  [users description]]; 

      // NSDictionary *eventLocation = [NSDictionary dictionaryWithObjectsAndKeys:@"response", nil]; 

      NSDictionary *loginResponse = [loginAuth objectAtIndex:0];   // this retrieves the first user 
      NSString *userResponse = loginResponse[@"gendersList"];   // this retrieves that user's username in Xcode 4.5 and greater 

      NSString *userRes = [loginResponse objectForKey:@"id"]; 

      NSString *test = [loginAuth description]; 

      NSLog(@"Returned Code loginResponse %@",loginResponse); 
      NSLog(@"Returned Code userResponse %@ %@",userResponse, userRes); 
      NSLog(@"Returned Code test %@",test); 

      NSMutableArray *array=[[NSMutableArray alloc]initWithCapacity:10]; 

      for (NSDictionary *defineXMLData in loginAuth) { 

       NSNumber * responseCode = [defineXMLData objectForKey:@"responseCode"]; 
       NSArray * responseDEsc = [defineXMLData objectForKey:@"responseDesc"]; 
       NSArray * genderList = [defineXMLData objectForKey:@"gendersList"]; 
       // NSArray * gender = [defineJsonData objectForKey:@"gender"]; 

       NSLog(@"Genders%@", genderList); 

       [array addObject: responseCode]; 
       [array addObject: responseDEsc]; 
       [array addObject: genderList]; 
       //[array addObject: gender]; 
       // [array addObject: vouchersUser]; 
      } 

      label.numberOfLines = 2000; // for example 
      label.lineBreakMode = NSLineBreakByClipping; 
      NSString *output=[array componentsJoinedByString:@","]; 
      label.text = [NSString stringWithFormat:@"XML Result: %@ ",output]; 

      [SVProgressHUD dismiss]; 

      //   [[[UIAlertView alloc] initWithTitle:nil 
      //          message:[NSString stringWithFormat:@"No errors - user count : %i", [[parser items] count]] 
      //          delegate:nil 
      //        cancelButtonTitle:@"OK" 
      //        otherButtonTitles:nil] show]; 

     } 
     else 
     { 
      NSLog(@"Error parsing document!"); 

      //   [[[UIAlertView alloc] initWithTitle:nil 
      //          message:@"Error parsing document!" 
      //          delegate:nil 
      //        cancelButtonTitle:@"OK" 
      //        otherButtonTitles:nil] show]; 
     } 

    } 
    else 
    { 
     NSLog(@"theConnection is NULL"); 
    } 

    NSLog(@"test"); 

} 

И XML я вернусь из моего NSLog:

<?xml version="1.0" encoding="UTF-8"?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:getAllGendersResponse xmlns:ns2="http://app.ws.api.bells.wigroup.com/"> 
     <return> 
      <responseCode>-1</responseCode> 
      <responseDesc>Success</responseDesc> 
      <response> 
       <responseCode>-1</responseCode> 
       <responseDesc>Success</responseDesc> 
       <gendersList> 
        <gender>Male</gender> 
        <id>1</id> 
       </gendersList> 
       <gendersList> 
        <gender>Female</gender> 
        <id>2</id> 
       </gendersList> 
      </response> 

Есть только синтаксический анализ:

{ 
gendersList = Female2; 
responseCode = "-1"; 
responseDesc = Success; 
} 

ответ

0

Вы не правильно указали проблема. Ваш код анализирует весь документ, но вы сохраняете только последние элементы (последний genderList, last responseCode, last responseDesc). Инициализируйте массив и в цикле for добавьте каждый словарь в этот массив при анализе.