2

我尝试解析人员列表并用名称污染 UITableView。但是我要解析的人有特殊字符(ä、ö、ü)。现在,如果我开始解析名称“Gött”,那么它就是“ött”。真的很奇怪,有什么想法吗?非常感谢!

-(id) loadXMLByURL:(NSString *)urlString
{
    tweets          = [[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:@"lehrer"]) 
    {
        currentTweet = [Tweet alloc];
    }
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementname isEqualToString:@"name"]) 
    {
        currentTweet.content = currentNodeContent;
    }
    if ([elementname isEqualToString:@"vorname"]) 
    {
        currentTweet.vorname = currentNodeContent;
    }
    if ([elementname isEqualToString:@"created_at"]) 
    {
        currentTweet.dateCreated = currentNodeContent;
    }
    if ([elementname isEqualToString:@"lehrer"]) 
    {
        [tweets addObject:currentTweet];
        [currentTweet release];
        currentTweet = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

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

@end
4

2 回答 2

3

根据伍迪的回答,这是完全可以预料的。您将需要连接来自多个- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string调用的字符串。

正确的方法如下:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (currentElementContent== nil)
        currentElementContent = [[NSMutableString alloc] initWithString:string];
    else
        currentElementContent = [currentElementContent stringByAppendingString:string];
}

无论如何,您应该始终在方法的最后设置currentElementContentto 。下面是一个示例:nildidEndElement

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    // Do what you want with the parser here

    // Set element content variable to nil
    currentElementContent = nil;
}

您可能需要用currentElementContent您在解析器中使用的任何变量替换变量:以容纳在开始和结束标记之间找到的内容。

于 2013-12-02T16:11:59.150 回答
3

这是正常行为 - parser:foundCharacters 可以为一个字符串多次调用(并且往往是重音字符)。您的字符串直到元素末尾才完成,因此请存储它们并在到达块末尾时使用完整的字符串。它在 foundCharacters 的文档中

NSXMLParser 上的 Apple 开发人员文档

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

根据问题编辑:

一般的代码很好,但在字符函数中,做

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

然后在 didStart 和 didEnd 中调用一个方法来检查字符串是否为 nil,首先执行您要对其执行的操作,然后释放字符串(并将其设为空)。

字符串在新元素的开头(即开头 < 之前的文本)和结尾(在

于 2012-04-30T20:13:09.610 回答