假设您已经决定要手动进行此解析,而不是使用 NSXMLParser 和委托中的适当实体调用,那么您可能希望为此使用表驱动解析器。
由于 & 在 XML 中始终是对实体的介绍,因此可以安全地执行以下操作(假设您正在解析 XML 而不是 HTML,它可以对允许的内容有一个非常宽松的定义):
if ([scanner scanString: @"&" intoString: nil]) {
NSString *entityNameString;
if ([scanner scanUpToString: @";" intoString: entityNameString]) {
NSString *entityValue =[entityDictionary objectForKey: entityNameString];
if (entityValue)
[result appendString: entityValue];
else {
// TODO: figure out if you want to blow an error, ignore the entity, or insert the original string
[result appendString: [NSString stringWithFormat: @"&%@;", entityNameString]];
}
} else {
// TODO: Determine if you want to blow an error, ignore, or insert the original string
[result appendString: @"&"];
}
}
entityDictionary 将是一个键值对字典,表示每个实体及其表示的字符串:
NSDictionary *entityDictionary = [NSDictionary dictionaryWithObjectsAndKeys: @"µ",@"micro", @"π", @"Pi",nil];
或者您可以使用以下方法从 plist 加载:
NSDictionary *entityDictionary = [NSDictionary dictionaryWithContentsOfURL: @"myEntityList.plist"];