将Plist(NSString)解析为NSDictionary

chr*_*o16 26 xml cocoa parsing objective-c plist

所以我有一个plist结构化字符串,它是动态获取的(不是来自文件系统).我如何将此字符串转换为NSDictionary.

我尝试将其转换为NSData,然后转换为带有NSPropertyListSerialization的NSDictionary,但当我尝试访问NSDictionary时,它返回"[NSCFString objectAtIndex:]:无法识别的选择器发送到实例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> 
Run Code Online (Sandbox Code Playgroud)

谢谢!

Pet*_*wis 72

请参阅序列化属性列表

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];
}
Run Code Online (Sandbox Code Playgroud)

  • 现在不推荐使用此方法,您应该使用propertyListWithData:options:format:error:而不是. (18认同)
  • +1你的解决方案似乎很精致 - 使用不可变创建一个NSDictionary并记住如果有一个值得奖励点发布错误.:-) (4认同)

Mar*_*pic 12

试试这个:

NSData * data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

NSString *errorDesc = nil;
NSPropertyListFormat format;
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization
                                      propertyListFromData:data
                                      mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                      format:&format
                                      errorDescription:&errorDesc];
Run Code Online (Sandbox Code Playgroud)