whitespaceAndNewlineCharacterSet似乎是在特殊字符之前删除空格

时间:2012-01-30 19:04:14

标签: objective-c ios nsstring nsxmlparser

我正在使用NSXMLParser来解析RSS Feed。但是我得到了一些奇怪的行为,我相信我已经缩小到stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]

如果我有这样的句子:

您好,我的名字是“桑尼。”

最终会显示如下:

您好,我的名字是“Sonny。”

这是我的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,这解决了问题但导致出现各种不需要的空格和回车。有关为什么会发生这种情况的想法以及我可以采取哪些措施来解决这个问题?

更新

所以我根据Dirk的答案更新了我的代码,这似乎很好地完成了这个伎俩。

- (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 个答案:

答案 0 :(得分:2)

在这种情况下:

<element>Some Content</element>

你不应该完全接受以下事件序列:

  • startElement“元素”
  • characterData“部分内容”
  • endElement“元素”

它也可以(取决于解析器的内部,如缓冲区大小等):

  • startElement“元素”
  • characterData“所以”
  • characterData“me Cont`
  • characterData“ent”
  • endElement“元素”

为了安全起见,您应该只是存储收到的字符,直到看到元素结束事件,然后才对结果应用修剪操作。

From the NSXMLParser documentation

  

解析器对象可以向委托发送几个解析器:foundCharacters:消息来报告元素的字符。因为字符串可能只是当前元素的总字符内容的一部分,所以应该将其附加到当前字符的累积中,直到元素发生变化。