在聊天项目中发现内容里面只要有< 和&这两个字符,就显示不了,后来查资料发现这是xml中的非法字符在作怪,解决的办法是在编码之前,也就是把文本信息转化成xml格式之前先用实体引用替换了,message = [message stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
message = [message stringByReplacingOccurrencesOfString:@"<" withString:@"<"];;//实体引用;之后在xml解析的时候,在代理方法- (NSData *) parser:(NSXMLParser *)parser
resolveExternalEntityName:(NSString *)entityName
systemID:(NSString *)systemID {
static NSDictionary* entityTable = nil;
if (!entityTable) {
entityTable = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSData dataWithBytes:" " length:1], @"nbsp",
[NSData dataWithBytes:"&" length:1], @"&",
[NSData dataWithBytes:"\"" length:1], @"quot",
[NSData dataWithBytes:"<" length:1], @"<",
[NSData dataWithBytes:">" length:1], @"gt",
nil];
}
return [entityTable objectForKey:entityName];
}
里面,把实体引用的字符再替换回来,就ok了!
实体引用
在 XML 中,一些字符拥有特殊的意义。
如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误:
<message>if salary < 1000 then</message>
为了避免这个错误,请用实体引用来代替 "<" 字符:
<message>if salary <
1000 then</message>
在 XML 中,有 5 个预定义的实体引用:
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 单引号 |
" | " | 引号 |
注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。