NSXMLParser разделяет строки, содержащие иностранные (юникод) символы - PullRequest
1 голос
/ 22 февраля 2012

У меня возникла специфическая проблема с NSXMLParser.

По какой-то причине он обрезает все символы перед всеми норвежскими символами æ, ø и å.

ОднакоКажется, проблема одинакова со всеми не-символами. (Все иностранные символы)

Примеры:

Реальность: Mål Вывод: ål

Реальность: Le chant des sirènes Вывод: ènes

Вот пример из журнала, где я распечатал строку из:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

Log:

2012-02-22 14:00:01.647 VotePlayClient[2776:207] found characters: Le chant des sir
2012-02-22 14:00:01.647 VotePlayClient[2776:207] found characters: ènes

Вы можете ясно видеть, что он прыгаетна новую строку всякий раз, когда встречается иностранная буква.

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

Вот файлы NSXMLParser:

SearchXMLParser.h

#import <Foundation/Foundation.h>
#import "Search.h"

@interface SearchXMLParser : NSObject <NSXMLParserDelegate>
{
NSMutableString *currentNodeContent;
NSMutableArray *searchhits;
NSMutableArray *trackhits;

NSXMLParser *parser;
Search *currentSearch;  
}

@property (readonly, retain) NSMutableArray *searchhits;
@property (readonly, retain) NSMutableArray *trackhits;

-(id) loadXMLByURL:(NSString *)urlString;

@end

SearchXMLParser.m

#import "SearchXMLParser.h"
#import "Search.h"

@implementation SearchXMLParser

@synthesize searchhits, trackhits;

-(id) loadXMLByURL:(NSString *)urlString
{
    searchhits          = [[NSMutableArray alloc] init];
trackhits           = [[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;    
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementname isEqualToString:@"track"]) 
{
    currentSearch = [Search alloc];
}

if ([elementname isEqualToString:@"track"]) 
{
    currentSearch.trackurl = [attributeDict objectForKey:@"href"];
}
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
if ([elementname isEqualToString:@"name"]) 
{
    [trackhits addObject:currentNodeContent];

}

if ([elementname isEqualToString:@"track"]) 
{
    currentSearch.track = [trackhits objectAtIndex:0];
    currentSearch.artist = [trackhits objectAtIndex:1];
    currentSearch.album = [trackhits objectAtIndex:2];
    [trackhits removeAllObjects];

    [searchhits addObject:currentSearch];
    [currentSearch release];
    currentSearch = nil;
    [currentNodeContent release];
    currentNodeContent = nil;
}
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"found characters: %@", string);
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (void) dealloc
{
[parser release];
[super dealloc];
}

@end

Я уже проверил SO на наличие ответов и нашел пару похожих сообщений, но ничего, что не давало ясного решенияк этой проблеме.

Может кто нибудьЧто-нибудь про эту проблему?:) Любая помощь очень ценится!

1 Ответ

9 голосов
/ 22 февраля 2012

ваш анализатор: foundCharacters: метод не работает должным образом.

Это из NSXMLParserDelegate Reference Reference

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

, вы можете попробовать что-нибудькак это (ARC):

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"found characters: %@", string);
    if (!currentNodeContent) {
        currentNodeContent = [[NSMutableString alloc] init];
    }
    [currentNodeContent appendString:string];
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
    // your code here

    // when you are done with the string:
    currentNodeContent = nil;
}
...