【问题标题】:Parsing XML files with special characters解析带有特殊字符的 XML 文件
【发布时间】:2012-04-30 18:43:11
【问题描述】:

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

【问题讨论】:

    标签: objective-c xml ios5 xcode4.3


    【解决方案1】:

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

    Apple developer docs on NSXMLParser

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

    根据问题编辑:

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

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

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

    字符串在新元素的开头(即开头

    【讨论】:

    • 好吧,我找不到让它工作的方法。也许我做错了什么。你能具体说明你会做什么吗?
    • 编辑了问题以添加我会做的事情(尽管 NSLog 可能是你的第一选择)
    • 我也试过了,但如果我这样做了,我会得到我解析到我的 tableViewCell 的所有东西。但我只想显示此人的姓名。我认为那是因为字符串包含所有信息,不是吗?我能做些什么?谢谢
    • 我会检查 endElement 并使用 stringByTrimmingCharactersInSet 添加文本:只是为了摆脱额外的。
    【解决方案2】:

    根据伍迪的回答,这是完全可以预料的。您需要连接来自多个 - (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];
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多