的NSXMLParser无法解析特殊字符(重音)(NSXMLParser can't par

2019-06-23 18:22发布

我使用的NSXMLParser从URL解析XML(我的代码几乎完全一样在这里 )

一些元件包含特殊字符,如“A”,这将导致一个字LIK安德烈分裂成两个(A和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>

Answer 1:

我的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 ,而不是追加。 看到苹果文档在下面的链接。

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

从文档:

因为字符串可以是整个字符内容为当前元素的只是一部分,你应该把它附加到人物的电流累积,直到元素的变化。



Answer 2:

发现了这个问题! 这的确是找到的字符。 您应该更改您的代码如下:

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

我以前有同样的问题,和上述代码已固定它。



Answer 3:

使用

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];

并从它那里得到的字符串,这样做:

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

然后你就可以在你的NSXMLParserDelegate方法解析XML。

希望这可以帮助。



文章来源: NSXMLParser can't parse special characters (accents)