нужна помощь с использованием NSXMLParser с ASIHTTPRequest - PullRequest
0 голосов
/ 05 июля 2011

В настоящее время я пытаюсь разобрать строковое представление моего xml, которое я получаю из моего php-скрипта на моем сервере, который передается методу ASIHTTPRequest * - (void) requestFinished: (ASIHTTPRequest ) запрос

Я хочу использовать NSXMLParser для разбора этого xml, пока у меня все готово и работает, посмотрите код того, как я это сделал, однако проблема, с которой я сталкиваюсь, заключается в том, что он, кажется, обращается к * - (void ) parser: (NSXMLParser *) parser foundCharacters: (NSString ) string { метод несколько раз .. когда я только хочу, чтобы он обращался к нему один раз и возвращал значение. Любые идеи о том, почему это происходит, будут с благодарностью.

- (void)requestFinished:(ASIHTTPRequest *)request
{
    // Use when fetching text
    NSString *responseString = [request responseString];
    NSData *xData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
    //myCode.text = responseString;
    //NSLog(@" response %@", responseString);

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xData];

    [parser setDelegate:self];
    [parser parse];
    [parser release];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    if ([elementName isEqual:@"code"]) {
        NSLog(@"Found title!");
        titleString = [[NSMutableString alloc] init];
    }
}


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    [titleString appendString:string];
    NSLog(@"the code string =%@", titleString);

}

// Editted :::::

Я забыл добавить этот метод делегата, который вызывается последним и выдаст окончательный результат. И причина, по которой я сказал, что это не работает, заключается в том, что я написал что-то неправильно в имени метода .... все исправлено и работает отлично.

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqual:@"code"]) {
        //NSLog(@"ended title: %@", titleString);
        //Pass  code over to animation
        [self parseCodeForAnimation:titleString];

        [titleString release];
        titleString = nil;
    }   

}

1 Ответ

1 голос
/ 05 июля 2011

Как правило, SAX-парсеры многократно вызывают метод foundCharacters, в значительной степени зависящий от содержимого анализируемых данных.Все, что вы действительно можете сделать, это кодировать свое приложение таким образом, чтобы оно обрабатывало это правильно.Как правило, вы делаете это, сохраняя что-то вроде NSMutableData или NSMutableString и добавляя к нему при каждом вызове foundCharacters.Когда вы получите конечный тег, который означает, что больше данных не будет отправлено как часть этого элемента, вы сбрасываете изменяемое содержимое в строку, сохраняете его и сбрасываете буфер для следующего набора данных.

...