模型类中的NSXMLParser没有给我任何结果

时间:2012-01-31 12:48:52

标签: iphone ios nsxmlparser

我有一个单独的类来解析我从服务器获取的XML。这是我的模型类:

#import "CheckLoginModel.h"
#import "Common.h"
#import "Utils.h"
#import "Constants.h"

@implementation CheckLoginModel
@synthesize strUserID;
@synthesize strUserName;
@synthesize i;
@synthesize dict;

   -(void)CheckLogin:(NSString *)strDeviceToken
{
    dict = [[NSMutableDictionary alloc]init];
        @try
        {
            NSString *soapMessage = [NSString stringWithFormat:
                                     @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                                     "<soapenv:Envelope \n"
                                     "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" \n"
                                     "xmlns:tem=\"http://tempuri.org/\"> \n"
                                     "<soapenv:Header/>\n"
                                     "<soapenv:Body>\n"
                                     "<tem:CheckDeviceToken>\n"
                                     "<tem:dt>%@</tem:dt>\n"
                                     "</tem:CheckDeviceToken>\n"
                                     "</soapenv:Body>\n"
                                     "</soapenv:Envelope>\n",strDeviceToken];

            NSURL *url = [NSURL URLWithString:kMainURL]; 
            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://tempuri.org/IService1/CheckDeviceToken" 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 )
            {
                webData = [[NSMutableData data] retain];
            }
            else
            {
                NSLog(@"The Connection is NULL");
            }
        }@catch (NSException *ex) {
            [Utils LogExceptionOnServer:@"ChatApplicationAppDelegate" methodName:@"CheckLogin" exception:[ex description]];
        }

}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [webData setLength: 0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [webData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"ERROR with theConenction");
    [connection release];
    [webData release];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",theXML);
    [theXML release];

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData: webData];
    [xmlParser setDelegate:self];
    [xmlParser setShouldResolveExternalEntities: YES];
    [xmlParser parse];
    [xmlParser release];

    [connection release];
    [webData release];

    //if(strUserName != NULL)
    [[NSNotificationCenter defaultCenter] postNotificationName:@"register" object:self userInfo:dict];
    //[dict release];

}

#pragma mark -
#pragma mark XML PARSING RELATED FUNCTIONS
#pragma mark -

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName
   attributes: (NSDictionary *)attributeDict{

    if( [elementName isEqualToString:@"CheckDeviceTokenResult"])
    {

    }

    else if( [elementName isEqualToString:@"a:UserID"])
    {
        if(!soapResults)
            soapResults = [[NSMutableString alloc] init];

    }
    else if( [elementName isEqualToString:@"a:UserName"])
    {
        if(!soapResults)
            soapResults = [[NSMutableString alloc] init];

    }

}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if( [elementName isEqualToString:@"a:UserID"])
    {
        i = [soapResults intValue];
        strUserID = soapResults;
        soapResults = nil;
        [dict setObject:strUserID forKey:@"id"];
    }
    else if( [elementName isEqualToString:@"a:UserName"])
    {
        strUserName = soapResults;
        soapResults = nil;
        [dict setObject:strUserName forKey:@"name"];

    }

}


@end

当我调试我的应用程序并到达didEndElement时,soapResult什么都没给我。相反,当我在我的控制器类中使用相同的代码时,我得到了期望的结果,我想知道为什么。

1 个答案:

答案 0 :(得分:1)

你没有实现解析器:foundCharacters:我看到你在start元素中分配字符串,但你需要获取数据并在foundCharacters中设置soapResults。你在哪里分配给soapResults?我没有看到任何代码分配它,这就是为什么它没有。

此外,只要解析器到达元素的末尾,didEndElement就会触发 - 而不是在解析时。那将是parserDidEndDocument。因此,解析器可能会触及元素的末尾但仍未传递您感兴趣的两个元素。