Ответ на сложный анализ, содержащий такие символы, как '\ u00' - PullRequest
2 голосов
/ 16 августа 2011

Я использую парсер NSXML для анализа в приложении для iPhone.Теперь все работает нормально, за исключением случаев, когда данные поступают на французском языке.

Например, данные с сервера поступают как Ch\u00e9rie FM.

Теперь, используя аргумент string метода foundCharacters, я получаю только строку, так как остальные символы Ch не отображаются.Поэтому, наконец, моя строка усекается только до 'Ch' целого числа Cherie fm

Что можно сделать?

Код:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict
{   
    if (appDelegate.objPlayer.fromFlickrorRecommend == TRUE)
    {
        if([elementName isEqualToString:@"outline"] && [[attributeDict valueForKey:@"text"] isEqualToString:@"You may also like"])
        {
            flagCheck = 1;
        }
        else if ([elementName isEqualToString:@"outline"] && [[attributeDict valueForKey:@"text"] isEqualToString:@"Genres"]) 
        {
            flagCheck = 0;
        }
        if (flagCheck == 1 && [elementName isEqualToString:@"outline"])
        {
            if([[attributeDict valueForKey:@"type"] isEqualToString:@"audio"])
            {
                [appDelegate.objPlayer.recommendDataArray addObject:attributeDict];

            }
        }
    }
    else
    {
        if ([elementName isEqualToString:@"location"])
        {
            flagCheck = 2;
        }
        else if ([elementName isEqualToString:@"url"])
        {   
            flagCheck = 3;
        }
        else if ([elementName isEqualToString:@"name"])
        {   
            flagCheck = 4;
        }
    }   
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{ 
    if (flagCheck == 2)
    {
        flagCheck = -1;
        appDelegate.objPlayer.flickrCity = string;
    }
    else if(flagCheck == 3)
    {
        flagCheck = -1;
        appDelegate.objPlayer.stationURL = string;
    }
    else if(flagCheck == 4)
    {
        flagCheck = -1;
        appDelegate.playStationName = string;
    }
    //else if(flagCheck == 0) // change
//  {
//      appDelegate.playStationName = string;
//  }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
    //if (flagCheck == 1 && [elementName isEqualToString:@"outline"])
//  {
//      [appDelegate.objPlayer.recommendDataArray addObject:dataDictionary];
//      dataDictionary = nil;
//      [dataDictionary release];
//  }
}

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string можно вызывать несколько раз, поэтому вам нужно накопить символы, найденные в NSMutableString. Пример того, как это реализовать, приведен в Руководстве по программированию на основе событий XML .

Объект парсера может отправить делегату несколько parser: foundCharacters: сообщения для сообщения о символах элемент. Потому что строка может быть только частью общего символа содержание для текущего элемента, вы должны добавить его к текущему накопление символов, пока элемент не изменится.

Теперь \u00e9 - это UTF-16 для é, поэтому данные должны быть правильно закодированы для анализа после \ u00. Поэтому, если ваши данные изначально были строкой, вы можете получить данные из нее следующим образом.

NSString *text = @"<node>Ch\u00e9rie</node>";
//Important or the parser will stop after Ch
NSData *utf16encode = [text dataUsingEncoding:NSUTF16StringEncoding];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:utf16encode];
0 голосов
/ 17 августа 2011

Получил ответ:

Эта ссылка помогла, когда я проходил через stackoverflow для вопросов, похожих на мою проблему.

Почему массивы обрабатывают строки, содержащие шведские символы ÅÄÖ, используядва или более индекса?

Надеюсь, это поможет всем, кто ищет решение.:)

...