【问题标题】:whitespaceAndNewlineCharacterSet seems to be removing white space before special characterswhitespaceAndNewlineCharacterSet 似乎正在删除特殊字符之前的空格
【发布时间】:2012-02-22 13:34:30
【问题描述】:

我正在使用 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,这解决了问题,但导致各种不需要的空格和回车出现。关于为什么会发生这种情况以及我可以做些什么来解决它的任何想法?

更新

所以我根据下面 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];
    }
}

【问题讨论】:

  • 是从“Sonny”的前面剪掉还是从“is”的末尾剪掉。换句话说,输入是什么?尝试添加 NSLog(@"appending|%@|",string);到循环。

标签: objective-c ios nsstring nsxmlparser


【解决方案1】:

在这样的情况下:

<element>Some Content</element>

您不应完全依赖于接收以下事件序列:

  • startElement“元素”
  • characterData“一些内容”
  • endElement“元素”

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

  • startElement“元素”
  • characterData“所以”
  • characterData"我继续`
  • characterData“恩特”
  • endElement“元素”

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

From the NSXMLParser documentation:

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

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多