Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 解析来自网站的XML响应_Objective C_Afnetworking_Kissxml - Fatal编程技术网

Objective c 解析来自网站的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

目前我正在为我的iOS应用程序编写一个在线登录,我做了一些研究,研究了应该使用什么库来处理HTTP请求和XML解析。最后,我使用了AFNetworking和KissXML。我还将KissXML添加用于AFNetworking。对网站的请求是成功的,但我在解析收到的XML时有点卡住了

响应如下所示:

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