我知道有很多问题已经被提出和回答,但没有一个与我的问题有关。
我将 XML 发布到服务器并收到回复。我的问题是从响应中获取指定的密钥。
我正在尝试列出所有性别,例如男性、女性及其 id,但是当使用 NSXML 将 XML 解析为文本时,我只能返回女性和 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");
}
我从我的 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;
}