解析具有特殊字符的XML文件

时间:2012-04-30 18:43:11

标签: objective-c xml ios5 xcode4.3

我尝试解析人员列表并用名称污染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

2 个答案:

答案 0 :(得分:3)

这是正常行为 - 解析器:可以为一个字符串多次调用foundCharacters(并且往往用于重音字符)。你的字符串直到元素结尾才完成,所以存储它们并在到达块的末尾时使用完整的字符串。 它位于foundCharacters

的文档中

Apple developer docs on NSXMLParser

  

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

按问题编辑:

一般来说代码很好,但在字符函数中,请执行

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

然后在didStart和didEnd两个方法中调用一个方法来检查字符串是否为nil,首先执行它将要执行的任何操作,然后释放字符串(并将其置空)。 / p>

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

答案 1 :(得分: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];
}

无论如何,您应该始终将currentElementContent设置为nil方法最后的didEndElement。下面是一个例子:

- (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替换为您在解析器中使用的任何变量,以容纳在开始和结束标记之间找到的内容。