NSXML XML解析问题iOS

NSXML XML解析问题iOS

问题描述:

我知道有很多问题已经被提出并回答,并且非问题与我的问题有关。NSXML XML解析问题iOS

我发布XML到服务器,我得到了回应。我的问题是从响应中获取指定的密钥。

我想列出所有的性别,例如男性,女性和他们的身份证,但是当解析XML到NSXML的文本中,我只能回到女性和身份证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"); 

} 

而且我从我的NSLog回XML:

<?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; 
} 

您没有正确地指出了问题。你的代码解析整个文档,但你只保留最后的项目(最后一个genderList,最后一个responseCode,最后一个responseDesc)。初始化数组并在for循环中将每个字典添加到解析的数组中。