【问题标题】:NSXMLParser divides strings containing foreign(unicode) charactersNSXMLParser 分割包含外来(unicode)字符的字符串
【发布时间】:2012-03-12 21:00:02
【问题描述】:

我在使用 NSXMLParser 时遇到了一个特殊问题。

由于某种原因,它删除了所有挪威字符 æ、ø 和 å 前面的所有字符。

但是,问题似乎与所有非 a-z 字符相同。(所有外来字符)

例子:

现实:马尔 输出:ål

现实:Le chant des sirènes 输出:ènes

这是我打印出字符串的日志示例:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

日志:

2012-02-22 14:00:01.647 VotePlayClient[2776:207] found characters: Le chant des sir
2012-02-22 14:00:01.647 VotePlayClient[2776:207] found characters: ènes

你可以清楚的看到它遇到外来字母就跳到新的一行。

我相信我必须弄清楚如何附加字符串或其他内容。

这里是 NSXMLParser 文件:

SearchXMLParser.h

#import <Foundation/Foundation.h>
#import "Search.h"

@interface SearchXMLParser : NSObject <NSXMLParserDelegate>
{
NSMutableString *currentNodeContent;
NSMutableArray *searchhits;
NSMutableArray *trackhits;

NSXMLParser *parser;
Search *currentSearch;  
}

@property (readonly, retain) NSMutableArray *searchhits;
@property (readonly, retain) NSMutableArray *trackhits;

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

@end

SearchXMLParser.m

#import "SearchXMLParser.h"
#import "Search.h"

@implementation SearchXMLParser

@synthesize searchhits, trackhits;

-(id) loadXMLByURL:(NSString *)urlString
{
    searchhits          = [[NSMutableArray alloc] init];
trackhits           = [[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:@"track"]) 
{
    currentSearch = [Search alloc];
}

if ([elementname isEqualToString:@"track"]) 
{
    currentSearch.trackurl = [attributeDict objectForKey:@"href"];
}
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
if ([elementname isEqualToString:@"name"]) 
{
    [trackhits addObject:currentNodeContent];

}

if ([elementname isEqualToString:@"track"]) 
{
    currentSearch.track = [trackhits objectAtIndex:0];
    currentSearch.artist = [trackhits objectAtIndex:1];
    currentSearch.album = [trackhits objectAtIndex:2];
    [trackhits removeAllObjects];

    [searchhits addObject:currentSearch];
    [currentSearch release];
    currentSearch = nil;
    [currentNodeContent release];
    currentNodeContent = nil;
}
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"found characters: %@", string);
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

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

@end

我已经检查了 SO 的答案并找到了几个类似的帖子,但没有一个明确的解决方案。

谁能解释一下这个问题? :) 非常感谢任何帮助!

【问题讨论】:

  • 使用可变字符串附加找到的字符,在元素结束时刷新(重置)它。

标签: iphone utf-8 xml-parsing nsxmlparser


【解决方案1】:

您的 parser:foundCharacters: 方法无法正常工作。

这是来自NSXMLParserDelegate Protocol Reference

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

你可以尝试这样的事情(ARC):

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

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
    // your code here

    // when you are done with the string:
    currentNodeContent = nil;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2017-07-08
    • 2011-03-31
    • 2020-12-19
    • 2012-06-01
    相关资源
    最近更新 更多