NSXMLParser无法解析特殊字符(重音符号)

10

我正在使用NSXMLParser解析从URL获取的XML(我的代码与这里几乎相同)

一些元素包含特殊字符,如“á”,这会导致单词像ándre拆分成两个部分(á和ndre)。

这是我的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),但我不确定该在哪里/如何应用它。
[更新] 我的其余代码...
- (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...

<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>

我对Obj-C完全不熟悉,但是我认为你可以将数据转换为NSString,将其编码为UTF8(如此处所示),然后将其传递给NSXMLParser? - brettkelly
我经常使用NSXMLParser,从来没有遇到过这个问题。你能贴出处理XML文本的代码部分吗? - Javier C
我已经发布了我的代码的其余部分。我想知道问题现在是否出现在foundCharacters中? - Andrew Davis
3个回答

6
我会将URL加载到一个NSString中,然后进行如下转换。
-(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文档。

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

来自文档:

因为字符串可能仅是当前元素的总字符内容的一部分,所以您应将其附加到当前字符累积中,直到元素发生更改。


1
谢谢。那并没有完全解决我的问题(尽管我认为它会!)。通过运行NSLog(@"%@", dataString);,可以看到字符串确实包含有重音等字符,这很好。然而像ándre这样的词仍然无法解决。这使我想到问题可能出现在foundcharacters()函数中。请查看我更新的问题。 - Andrew Davis
你提到的日志中工作是否已经损坏,还是仅在经过解析器后才出现问题? - Jeff Wolski
也许您可以提供一个实际的XML解析示例。 - Jeff Wolski
更新了原始问题,并附上了示例XML。谢谢。 - Andrew Davis
@AndrewDavis,你找到解决这个问题的方法了吗?我也遇到了同样的问题,字符串在带有重音符号时会被分割。如果你找到了解决方法,能否分享一下? - Juan
显示剩余2条评论

4

已找到问题!问题确实在发现字符中。您应该将代码更改为:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"found characters: %@", string);
    if (!currentNodeContent) {
        currentNodeContent = [[NSMutableString alloc] init];
    }
    [currentNodeContent appendString:string];
}

我之前也遇到过同样的问题,上述代码已经解决了它。


if (!currentNodeContent) 这个条件意味着什么? - iPeter
它会检查字符串是否为空吗? - iPeter
@iPeter 它检查 nil。它相当于 if (currentNodeContent == nil) { - Jeff Wolski

1

使用

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];

要从中获取字符串,可以这样做:

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes]
                                                    length:[data length]
                                                 encoding:NSUTF8StringEncoding];

然后您可以在NSXMLParserDelegate方法中解析xml。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接