NSXMLParser не может разобрать специальные символы (акценты)
Я использую NSXMLParser для анализа xml из URL (мой код почти такой же, как здесь)
Некоторые из элементов содержат специальные символы, такие как "á", что приводит к тому, что слово lik ndre разбивается на два (á и ndre).
Вот мой loadXMLByURL
-(id) loadXMLByURL:(NSString *)urlString{
tickets = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;}
Я почти уверен, что это потому, что кодировка не установлена (я думаю, что это должно быть NSUTF8StringEncoding), но я не уверен, где и как его применить.
[ОБНОВЛЕНИЕ] Остальная часть моего кода...
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementname isEqualToString:@"ticket"])
{
currentTicket = [Ticket alloc];
}
}
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementname isEqualToString:@"name"])
{
currentTicket.name = currentNodeContent;
}
else if ([elementname isEqualToString:@"title"])
{
currentTicket.title = currentNodeContent;
}
else if ([elementname isEqualToString:@"status"])
{
currentTicket.status = currentNodeContent;
}
else if ([elementname isEqualToString:@"ticket"])
{
[tickets addObject:currentTicket];
[currentTicket release];
currentTicket = nil;
[currentNodeContent release];
currentNodeContent = nil;
}
}
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
[ОБНОВЛЕНИЕ 2] Образец xml...
<RB>
<list>
<ticket>
<name>Andrew Ford</name>
<title>3rd release</title>
<status>1</status>
</ticket>
<ticket>
<name>David Jenkins</name>
<title>3rd release</title>
<status>0</status>
</ticket>
<ticket>
<name>Luis gomez ándre</name>
<title>3rd release</title>
<status>1</status>
</ticket>
</list>
</RB>
3 ответа
Я бы загрузил URL в NSString
а затем конвертировать, как это.
-(id) loadXMLByURL:(NSString *)urlString{
tickets = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSError *error;
NSString * dataString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;
}
РЕДАКТИРОВАТЬ: Частично проблема может быть в том, что ваш parser:foundCharacters:
метод присваивает вашему currentNodeContent
вместо добавления. См. Apple Doc по следующей ссылке.
Из документа:
Поскольку строка может быть только частью общего символьного содержимого для текущего элемента, вы должны добавить его к текущему накоплению символов, пока элемент не изменится.
Нашел проблему! Это действительно в найденных персонажах. Вы должны изменить свой код на это:
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"found characters: %@", string);
if (!currentNodeContent) {
currentNodeContent = [[NSMutableString alloc] init];
}
[currentNodeContent appendString:string];
}
У меня была такая же проблема раньше, и приведенный выше код исправил ее.
Использование
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
и чтобы получить строку из этого, сделайте это:
NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes]
length:[data length]
encoding:NSUTF8StringEncoding];
Затем вы можете проанализировать xml в ваших методах NSXMLParserDelegate.
Надеюсь это поможет.