Objective c 解析来自网站的XML响应
目前我正在为我的iOS应用程序编写一个在线登录,我做了一些研究,研究了应该使用什么库来处理HTTP请求和XML解析。最后,我使用了AFNetworking和KissXML。我还将KissXML添加用于AFNetworking。对网站的请求是成功的,但我在解析收到的XML时有点卡住了 响应如下所示:Objective c 解析来自网站的XML响应,objective-c,afnetworking,kissxml,Objective C,Afnetworking,Kissxml,目前我正在为我的iOS应用程序编写一个在线登录,我做了一些研究,研究了应该使用什么库来处理HTTP请求和XML解析。最后,我使用了AFNetworking和KissXML。我还将KissXML添加用于AFNetworking。对网站的请求是成功的,但我在解析收到的XML时有点卡住了 响应如下所示: <login> <response status="success" result="correct"/> <data> <u
<login>
<response status="success" result="correct"/>
<data>
<username>testusername</username>
<country>Germany</country>
</data>
</login>
有谁能给我一个关于如何改进代码和如何正确操作的提示吗。因为如果我想将localerror分配给错误,我总是会得到一个错误:(如果我理解正确,您在解析XML响应时会遇到问题。我通常只使用Apple的流XML解析器NSXMLParser。它简单、快速且易于使用 我为您做了一个小示例项目(使用ARC),使用NSXMLParser解析您描述的XML响应: 您可以使用它并运行项目,但重要的部分是NSXMLParser委托:
@interface ETLoginInfoXMLParser ()
@property (strong,nonatomic) NSMutableString *currentElementValue;
@property (strong,nonatomic) ETLoginInfo *loginInfo;
@end
@implementation ETLoginInfoXMLParser
#pragma mark - NSXMLParserDelegate
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"login"]) {
if (!self.loginInfo) {
self.loginInfo = [[ETLoginInfo alloc] init];
}
return;
}
if ([elementName isEqualToString:@"response"]) {
self.loginInfo.responseStatus = [attributeDict objectForKey:@"status"];
self.loginInfo.responseResult = [attributeDict objectForKey:@"result"];
}
}
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!self.currentElementValue) {
self.currentElementValue = [[NSMutableString alloc] initWithString:string];
} else {
[self.currentElementValue appendString:string];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"username"]) {
NSString *trimmedValue = [self.currentElementValue stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
self.loginInfo.username = trimmedValue;
}
if ([elementName isEqualToString:@"country"]) {
NSString *trimmedValue = [self.currentElementValue stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
self.loginInfo.country = trimmedValue;
}
self.currentElementValue = nil;
}
/** Parse XML login response */
+(ETLoginInfo *)parseXMLLoginResponse:(NSString *)xml {
ETLoginInfoXMLParser *loginInfoParser = [[ETLoginInfoXMLParser alloc] init];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
[xmlParser setDelegate:loginInfoParser];
BOOL success = [xmlParser parse];
if (success) {
return loginInfoParser.loginInfo;
} else {
NSLog(@"Error parsing login information");
return nil;
}
}
@end
我将其连接到一个愚蠢的iOS应用程序,以显示此XML响应的解析:
<login>
<response status="success" result="correct"/>
<data>
<username>Willy Wonka</username>
<country>Germany</country>
</data>
</login>
威利旺卡
德国
您可能需要一个更有趣的模型层次结构,因为我-为了简单起见,请将所有内容放在同一个实体中谢谢您的评论。但我想使用KissXML,因为AFNetworking的扩展非常好。为了更详细地描述我的问题,我正在努力解决错误。我正在使用一个本地的ck NSError,但我无法将其分配给方法调用中给出的错误。它表示无法将NSError\uuu块分配给NSError。此外,我不知道for循环是否正确。您是否使用AFNetwork和KissXML找到了解决方案,或者您是否使用了下面的答案?如果是,请与KissXML/AFNetwork分享您的结论
<login>
<response status="success" result="correct"/>
<data>
<username>Willy Wonka</username>
<country>Germany</country>
</data>
</login>