2012-04-18 3 views
9

Я использую NSXMLParser для синтаксического анализа XML из URL (мой код почти точно так же, как и here)NSXMLParser не может разобрать специальные символы (примы)

Некоторые элементы содержат специальные символы вроде « », который вызывает слово« lik », чтобы разделить на два (á и 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), но я не уверен, где/как применить его.

[UPDATE] Остальной мой код ...

- (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]]; 
} 

[UPDATE 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> 
+0

Я новичок в Obj-C, но мне кажется, что вы можете преобразовывать данные в NSString, кодируя это как UTF8 [как показано здесь] (http://stackoverflow.com/questions/2467844/ convert-utf-8-encoded-nsdata-to-nsstring) и передать это NSXMLParser? – inkedmn

+0

Я использую NSXMLParser много и не имел этой проблемы. Можете ли вы опубликовать часть кода, обрабатывающего XML-текст? –

+0

Написал остальную часть моего кода. Интересно, находится ли теперь проблема в найденных символах? –

ответ

5

Я бы загрузить 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; 

} 

EDIT: Часть проблемы может быть, что ваш метод parser:foundCharacters: является назначение на ваш currentNodeContent вместо добавления. См. Документ Apple Doc по следующей ссылке.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html

Из дока:

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

+1

Спасибо. Это не совсем решило мою проблему (хотя я и думал). Выполнение NSLog (@ "% @", dataString); показывает, что строка действительно включает символы с акцентами и т. д., что отлично.Однако слово, подобное ендре, все еще ломается. Это заставляет меня думать, что проблема заключается в foundcharacters(). См. Мой обновленный вопрос. –

+0

Является ли работа сломанной в журнале, о которой вы упомянули, или только после того, как подумала о парсере? –

+0

В журнале строки отображаются правильно. Когда вы добавляете объект в массив билетов, имя со специальным символом будет зарегистрировано как два отдельных объекта. –

1

Использование

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 

и получить строку из него, это сделать:

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes] 
                length:[data length] 
               encoding:NSUTF8StringEncoding]; 

Затем вы можете разобрать XML в ваших методах NSXMLParserDelegate.

Надеюсь, это поможет.

4

Обнаружена проблема! Это действительно в найденных персонажах. Вы должны изменить свой код на это:

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

У меня была такая же проблема раньше, и приведенный выше код исправил ее.

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