我尝试解析人员列表并用名称污染UITableView。但我要解析的人有特殊的性格(ä,ö,ü)。现在,如果我开始解析名称“Gött”,那么之后它就是“ött”。真奇怪,有什么想法吗?非常感谢!
-(id) loadXMLByURL:(NSString *)urlString
{
tweets = [[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:@"lehrer"])
{
currentTweet = [Tweet alloc];
}
}
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementname isEqualToString:@"name"])
{
currentTweet.content = currentNodeContent;
}
if ([elementname isEqualToString:@"vorname"])
{
currentTweet.vorname = currentNodeContent;
}
if ([elementname isEqualToString:@"created_at"])
{
currentTweet.dateCreated = currentNodeContent;
}
if ([elementname isEqualToString:@"lehrer"])
{
[tweets addObject:currentTweet];
[currentTweet release];
currentTweet = nil;
[currentNodeContent release];
currentNodeContent = nil;
}
}
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
- (void) dealloc
{
[parser release];
[super dealloc];
}
@end
答案 0 :(得分:3)
这是正常行为 - 解析器:可以为一个字符串多次调用foundCharacters(并且往往用于重音字符)。你的字符串直到元素结尾才完成,所以存储它们并在到达块的末尾时使用完整的字符串。 它位于foundCharacters
的文档中Apple developer docs on NSXMLParser
解析器对象可以向委托发送几个解析器:foundCharacters:消息来报告元素的字符。因为字符串可能只是当前元素的总字符内容的一部分,所以应该将其附加到当前字符的累积中,直到元素发生变化。
按问题编辑:
一般来说代码很好,但在字符函数中,请执行
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if(nil == currentNodeContent)
currentNodeContent = [[NSMutableString alloc] initWithString:string];
else
[currentNodeContent appendString:string];
}
然后在didStart和didEnd两个方法中调用一个方法来检查字符串是否为nil,首先执行它将要执行的任何操作,然后释放字符串(并将其置空)。 / p>
字符串在新元素的开头(即打开前的文本<)和结尾处(文本位之前)结束
答案 1 :(得分:3)
根据伍迪的回答,这是完全可以预料的。您需要连接多个- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
调用中的字符串。
执行此操作的正确方法如下:
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (currentElementContent== nil)
currentElementContent = [[NSMutableString alloc] initWithString:string];
else
currentElementContent = [currentElementContent stringByAppendingString:string];
}
无论如何,您应该始终将currentElementContent
设置为nil
方法最后的didEndElement
。下面是一个例子:
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// Do what you want with the parser here
// Set element content variable to nil
currentElementContent = nil;
}
您可能需要将变量:currentElementContent
替换为您在解析器中使用的任何变量,以容纳在开始和结束标记之间找到的内容。