Xcode NSXMLParser可以';t分析特殊字符(重音)

Xcode NSXMLParser可以';t分析特殊字符(重音),xcode,xml-parsing,nsxmlparser,nsxml,nsxmlelement,Xcode,Xml Parsing,Nsxmlparser,Nsxml,Nsxmlelement,我正在使用NSXMLParser从url解析xml(我的代码几乎与) 有些元素包含特殊字符,如“á”,这会导致单词likándre一分为二(á和ndre) 这是我的loadXMLByURL -(id) loadXMLByURL:(NSString *)urlString{ tickets = [[NSMutableArray alloc] init]; NSURL *url = [NSURL URLWithString:urlString]; NSData *data =

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

有些元素包含特殊字符,如“á”,这会导致单词liká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>

安德鲁·福特
第三版
1.
大卫·詹金斯
第三版
0
路易斯·戈麦赞德
第三版
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
而不是追加。请参见以下链接中的Apple文档

从文档:

因为字符串可能只是当前元素的全部字符内容的一部分,所以应该将其附加到当前字符的累加中,直到元素更改为止

使用

要从中获取字符串,请执行以下操作:

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes]
                                                    length:[data length]
                                                 encoding:NSUTF8StringEncoding];
然后,您可以在NSXMLParserDelegate方法中解析xml


希望这有帮助。

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

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

我以前也遇到过同样的问题,上面的代码已经解决了

我是Obj-C的新手,但在我看来,您可以将数据转换为NSString,将其编码为UTF8并将其传递给NSXMLParser?我经常使用NSXMLParser,但没有这个问题。您可以发布处理XML文本的代码部分吗?发布了我的其余代码。我想知道现在的问题是否在于角色?谢谢。这并没有完全解决我的问题(尽管我认为它会解决)!执行NSLog(@“%@”,数据字符串);显示字符串确实包含带有重音符号等的字符,这非常好。然而,像安德里这样的一个词仍在被打破。这让我觉得问题出在foundcharacters()中。请参阅我更新的问题。您提到的日志中的工作是否已中断,或者仅在解析器运行后才中断?日志中的字符串显示正确。将对象添加到tickets数组时,带有特殊字符的名称将注册为两个单独的对象。也许您可以提供一个实际解析xml的示例。使用示例xml更新原始问题。谢谢。
如果(!currentNodeContent)
条件意味着什么?检查字符串是否为空?@iPeter它检查
nil
。如果(currentNodeContent==nil){
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"found characters: %@", string);
    if (!currentNodeContent) {
        currentNodeContent = [[NSMutableString alloc] init];
    }
    [currentNodeContent appendString:string];
}