whitespaceAndNewlineCharacterSet, кажется, удаляет пробел перед специальными символами - PullRequest
0 голосов
/ 30 января 2012

Я использую NSXMLParser для разбора RSS-канала. Но у меня странное поведение, которое, я считаю, сузилось до stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet].

Если у меня есть такое предложение:

Здравствуйте, меня зовут "Сонни".

Это будет отображаться так:

Здравствуйте, меня зовут "Сонни".

Вот мой foundCharacters метод:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(!currentNodeContent) 
        currentNodeContent = [[NSMutableString alloc] initWithString:string];
    else
    {
        [currentNodeContent appendString:string];        
        NSString *trimmedString = currentNodeContent;
        trimmedString = [trimmedString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        [currentNodeContent setString:trimmedString];
    }
}

Я попытался изменить whitespaceAndNewlineCharacterSet на newlineCharacterSet, что устранило проблему, но привело к появлению всех видов нежелательных пробелов и возвратов каретки. Любые мысли о том, почему это происходит и что я могу сделать, чтобы это исправить?

UPDATE

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

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{    
    if ([elementname isEqualToString:@"item"]) 
    {
        [comments addObject:currentComment];
        currentComment = nil;
    }

    NSString *trimmedString = [tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    [currentNodeContent setString:trimmedString];
    tempString = nil;
    currentNodeContent = nil;
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(!currentNodeContent) {
        currentNodeContent = [[NSMutableString alloc] initWithString:string];
        tempString = [[NSMutableString alloc] init];
    } else {
        [tempString appendString:string];
    }
}

1 Ответ

2 голосов
/ 31 января 2012

В такой ситуации:

<element>Some Content</element>

вы не должны полагаться на получение точно такой последовательности событий:

  • startElement "element"
  • characterData «Некоторое содержимое»
  • endElement «элемент»

С таким же успехом может быть (в зависимости от интерна синтаксического анализатора, например, размера буфера и т. Д.):

  • startElement «элемент»
  • characterData «Так»
  • characterData «me Cont»
  • characterData"ent"
  • endElement "element"

Чтобы быть в безопасности, вы должны просто хранить полученные символы до тех пор, пока не будет замечено событие конца элемента, и только затем применятьоперация обрезки результата.

Из документации NSXMLParser :

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

...