0

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

所以我找到了这个并通过添加以下代码行对其进行了修改,

    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 是我的开发环境。

4

1 回答 1

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"];
于 2012-04-15T10:33:19.977 回答