NSXMLParser в классе модели не дает мне результата - PullRequest
0 голосов
/ 31 января 2012

У меня есть отдельный класс для разбора 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 Ответ

1 голос
/ 31 января 2012

Вы не реализуете parser: foundCharacters: я вижу, что вы выделяете строку в элементе start, но вам нужно будет получить данные и установить soapResults в foundCharacters. Где вы назначаете soapResults? Я не вижу кода, который когда-либо присваивает его, поэтому он равен нулю.

Кроме того, didEndElement запускается всякий раз, когда синтаксический анализатор достигает конца элемента, а не когда он завершает анализ. Это было бы parserDidEndDocument. Таким образом, возможно, что синтаксический анализатор достиг конца элемента, но все еще не прошел два интересующих вас элемента.

...