使用目标C解码XML实体

时间:2012-04-15 08:51:49

标签: objective-c ios ipad html-encode

我正在寻找一种解码我的iPad应用程序的某些特殊字符(如μ,Λ,μ,ν,π)的XML实体的方法。我通过博客和问题花了几个小时才找到解决方案。

所以我找到了this并通过添加以下代码行修改了它,

    else if ([scanner scanString:@"µ" intoString:NULL])
        [result appendString:@"µ"];
    else if ([scanner scanString:@"&Lambda" intoString:NULL])
        [result appendString:@"Λ"];
    else if ([scanner scanString:@"Π" intoString:NULL])
        [result appendString:@"Π"];

但我觉得这不是一个好的解决方案。

所以,我正在寻找别人的帮助。

XCode4和iOS 4.3是我的开发环境。

1 个答案:

答案 0 :(得分:1)

假设您已经决定手动执行此解析,而不是在委托中使用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"];