デリゲートで NSXMLParser と適切なエンティティ呼び出しを使用するのではなく、手動でこの解析を行うことを既に決定していると仮定すると、おそらくテーブル駆動型パーサーを使用することになります。
XML の & は常にエンティティへの導入であるため、次のようなことを行っても安全です (HTML ではなく XML を解析していると仮定すると、何が許可されているかについて大幅に緩和された定義を持つ可能性があります)。
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"];