将 Plist (NSString) 解析为 NSDictionary
Posted
技术标签:
【中文标题】将 Plist (NSString) 解析为 NSDictionary【英文标题】:Parse Plist (NSString) into NSDictionary 【发布时间】:2009-07-02 03:24:49 【问题描述】:所以我有一个 plist 结构化字符串,它是动态获取的(不是来自文件系统)。我如何将此字符串转换为 NSDictionary。
我尝试将其转换为 NSData,然后使用 NSPropertyListSerialization 转换为 NSDictionary,但是当我尝试访问 NSDictionary 时,它返回“[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x100539f40”,表明我的字典没有成功已创建。
NSString 示例(即 plist 数据):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Key1</key>
<dict>
<key>Test1</key>
<false/>
<key>Key2</key>
<string>Value2</string>
<key>Key3</key>
<string>value3</string>
</dict>
</dict>
</plist>
谢谢!
【问题讨论】:
【参考方案1】:见Serializing a Property List
NSData* plistData = [source dataUsingEncoding:NSUTF8StringEncoding];
NSString *error;
NSPropertyListFormat format;
NSDictionary* plist = [NSPropertyListSerialization propertyListWithData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
NSLog( @"plist is %@", plist );
if(!plist)
NSLog(@"Error: %@",error);
[error release];
【讨论】:
+1 你的解决方案看起来很漂亮——使用不可变的来创建一个 NSDictionary 并记住如果有一个值得加分的错误就释放。 :-) 我几乎称其为过度发布。嗯,哇。该 API 要求调用者释放该错误字符串,完全违反了内存管理规则。 根据发行说明,它更改为在 Leopard 中没有该违规行为。值得关注。有一个关于它的错误报告:openradar.appspot.com/5563963 我的理解是文档是正确的,而发行说明(现在)是错误的,因为 Apple 出于兼容性原因决定保留泄漏。 此方法现已弃用,您应该改用 propertyListWithData:options:format:error:。【参考方案2】:试试这个:
NSData * data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc];
【讨论】:
除了内存泄漏,但它确实发生了(: NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization ......您需要检查您尝试读取的文件,因为您可能返回的是 NSArray 而不是 NSDictionary。【参考方案3】:我尝试将其转换为 NSData,然后使用 NSPropertyListSerialization 转换为 NSDictionary,但是当我尝试访问 NSDictionary 时,它返回“[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x100539f40”,表明我的字典没有成功已创建。
不,它没有显示这样的东西。它显示的是您试图将字符串视为数组。您需要确定您试图在 plist 中的哪个位置获取一个数组,以及为什么在您期望数组的位置存在一个字符串 - 即,您是否错误地创建了 plist(将一个字符串放入其中您打算在哪里放置一个数组)或正在错误地检查它(字符串的存在是正确的;您随后对数组的期望是错误的)。
【讨论】:
以上是关于将 Plist (NSString) 解析为 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章