2013-01-07 2 views
0

Я пытаюсь разобрать XML с символами, как é, ñ я использую UTF8 как кодировка ..Получение XML с помощью специальных символов

Я уже пытался изменить закодировать NSISOLatin1StringEncoding но Она не работает

код:

-(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]; 
if(xmlParser) 
{ 
    [xmlParser release]; 
} 
xmlParser = [[NSXMLParser alloc] initWithData: webData]; 
[xmlParser setDelegate:self]; 
[xmlParser setShouldResolveExternalEntities:YES]; 
[xmlParser parse]; 
if (connection) { 
    [connection release]; 
    } 
    } 


-(void)callWS { 
    NSString *url = @"theUrlHere"; 
    NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:url]]; 
[request setHTTPMethod:@"GET"]; 

NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (conn) { 
     webData = [[NSMutableData data] retain]; 
    } 

Когда я получаю XML-ответ ... результаты с спе CIAL символов появляется неправильно ...

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    { 
    if(!soapResults) 
{ 
....//the soapResults here appears wrong when It has special chars... 

    } 

Пример: Caperuçú появляется Ĉu, Indianópolis появляется ópolis

+2

Просьба уточнить, что «появляется неправильно». –

+0

Вы уверены, что кодировка UTF8? – nhahtdh

+0

Пример: ** Caperuçú ** появляется ** çú **, ** Indianópolis ** появляется ** ópolis ** – Ladessa

ответ

3

Смотрите документацию метода parser:foundCharacters: делегата:

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

Я предполагаю, что ваш код не накапливает символы и просто использует результат последнегоparser:foundCharacters: вызова.

Следующий пример программы показывает этот эффект с входными строками:

-(void)parse 
{ 
    NSString *xmlString = @"<a><b>Indianópolis</b><c>Caperuçú</c></a>"; 
    NSData *xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding]; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData]; 
    parser.delegate = self; 
    [parser parse]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 
    NSLog(@"didStartElement: %@", elementName); 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    NSLog(@"didEndElement: %@", elementName); 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    NSLog(@"foundCharacters: %@", string); 
} 

Выход:

didStartElement: a 
didStartElement: b 
foundCharacters: Indian 
foundCharacters: ópolis 
didEndElement: b 
didStartElement: c 
foundCharacters: Caperu 
foundCharacters: çú 
didEndElement: c 
didEndElement: a 

Так что это не проблема кодирования.

+0

, но если найденный символ не имеет специального символа, персонаж приходит в уникальное время ... Как я могу приходите, когда есть специальный знак тоже? – Ladessa

+1

@illDev: Обычным решением является создание 'NSMutableString' (например, в' didStartElement') и добавление к этой строке в 'foundCharacters'. Затем у вас есть полная строка в 'didEndElement'. –

+0

Я создал appendString if (! SoapResults) soapResults = [[NSMutableString alloc] init]; NSLog (@ "stringFound:% @", строка); [soapResults appendString: string]; } , но второй элементName получает первое + второе значение имени элемента ... третий получает первую + вторую + третью .... – Ladessa

Смежные вопросы