NSXMLParser 无法解析特殊字符(重音) [英] NSXMLParser can't parse special characters (accents)

查看:83
本文介绍了NSXMLParser 无法解析特殊字符(重音)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 NSXMLParser 从 url 解析 xml(我的代码几乎与 这里)

I'm using NSXMLParser to parse an xml from a url (my code is almost exactly the same as here)

某些元素包含特殊字符,例如á",这会导致单词 lik ándre 分裂为两个(á 和 ndre).

Some of the elements contain special characters like "á" which causes a word lik ándre to split into two (á and ndre).

这是我的 loadXMLByURL

Here is my loadXMLByURL

-(id) loadXMLByURL:(NSString *)urlString{
tickets     = [[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;}

我很确定这是因为未设置编码(我认为它需要是 NSUTF8StringEncoding)但我不确定在哪里/如何应用它.

I'm pretty sure it's because the encoding is not set (I think it needs to be NSUTF8StringEncoding) but I'm not sure where/how to apply it.

[更新]我的其余代码...

[UPDATE] Rest of my code...

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{    
    if ([elementname isEqualToString:@"ticket"]) 
    {
        currentTicket = [Ticket alloc];
    }

}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementname isEqualToString:@"name"]) 
    {
        currentTicket.name = currentNodeContent;
    }
    else if ([elementname isEqualToString:@"title"]) 
    {
        currentTicket.title = currentNodeContent;
    }
    else if ([elementname isEqualToString:@"status"]) 
    {
        currentTicket.status = currentNodeContent;
    }
    else if ([elementname isEqualToString:@"ticket"])
    {
        [tickets addObject:currentTicket];
        [currentTicket release];
        currentTicket = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }

}

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

[更新 2]示例 xml...

[UPDATE 2] Sample xml...

<RB>
    <list>
        <ticket>
            <name>Andrew Ford</name>
            <title>3rd release</title>
            <status>1</status>
        </ticket>

        <ticket>
            <name>David Jenkins</name>
            <title>3rd release</title>
            <status>0</status>
        </ticket>

        <ticket>
            <name>Luis gomez ándre</name>
            <title>3rd release</title>
            <status>1</status>
        </ticket>
    </list>
</RB>

推荐答案

我会将 url 加载到 NSString 然后像这样转换.

I would load the url to an NSString and then convert like this.

-(id) loadXMLByURL:(NSString *)urlString{

    tickets     = [[NSMutableArray alloc] init];
    NSURL *url      = [NSURL URLWithString:urlString];
    NSError *error;
    NSString * dataString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    parser          = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
    return self;

}

部分问题可能是您的 parser:foundCharacters: 方法正在分配给您的 currentNodeContent 而不是附加.请参阅以下链接中的 Apple 文档.

Part of the problem may be that your parser:foundCharacters: method is assigning to your currentNodeContent instead of appending. See the Apple Doc at the following link.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html

来自文档:

因为字符串可能只是当前元素的全部字符内容的一部分,所以应该将其附加到当前的字符累积中,直到元素发生变化.

Because string may be only part of the total character content for the current element, you should append it to the current accumulation of characters until the element changes.

这篇关于NSXMLParser 无法解析特殊字符(重音)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆