无法将 Plist 中的数据加载到数组中

Posted

技术标签:

【中文标题】无法将 Plist 中的数据加载到数组中【英文标题】:Trouble Loading Data From Plist Into Array 【发布时间】:2012-01-05 22:06:31 【问题描述】:

我有一个奇怪的问题,可能有一个我无法找到/弄清楚的简单解决方案。任何想法都非常感谢。

我有一个包含作为根对象的数组的属性列表。该数组包含几个字典。

下面的代码显示了我如何尝试将 plist 数据加载到我的数组中-

-(void)awakeFromNib

    NSString *plistPath = @"/Users/administrator/Desktop/WipeOut Winner!/Data.plist";
    NSLog(@"Plist path is %@",plistPath);


    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) 
            NSLog(@"File wasn't found");
    


    tableDataArray = [[NSMutableArray alloc]initWithContentsOfFile:plistPath];

    NSLog(@"array count is %lu",[tableDataArray count]);   


下面是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>root</key>
    <array>
        <dict>
            <key>winner</key>
            <string>Scott</string>
            <key>personChosen</key>
            <string>Female</string>
            <key>winType</key>
            <string>2 and &apos;Won&apos; -3 pts.</string>
            <key>Points</key>
            <string>3</string>
        </dict>
        <dict>
            <key>winner</key>
            <string>Emily</string>
            <key>personChosen</key>
            <string>Male</string>
            <key>winType</key>
            <string>All The Way! -5 pts.</string>
            <key>points</key>
            <string>5</string>
        </dict>
    </array>
</dict>
</plist>

plist 文件按原样被找到。我已经确认我在 plist 中的根对象是一个数组(字典)。不过,我在此调用后的数组计数始终为零。

在试图弄清楚的过程中,我将 plist 中的数据更改为单个 NSDictionary 而不是包含字典的数组。然后我将 plist 加载到 NSDictionary 中,将该字典加载到数组中,并且数组计数如预期的那样为 1,因此我确信就 plist 的查找、加载等而言,事情已正确连接。在另一个测试中,而不是尝试使用下面的 plist 数据加载数组

tableDataArray = [[NSMutableArray alloc]initWithContentsOfFile:plistPath];

我一起绕过了 plist 的东西,只是像这样加载了数组-

tableDataArray =[[NSMutableArray alloc]initWithCapacity:1];

NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Emily",@"name",@"12",@"age", nil];

[tableDataArray addObject:dict];

这也按预期将数组计数更改为一。所以我认为我的问题与此有关

tableDataArray = [[NSMutableArray alloc]initWithContentsOfFile:plistPath];

但我似乎无法弄清楚在哪里。

【问题讨论】:

【参考方案1】:

plist 的根不是数组。它是一个带有单个键“根”的字典,它指向一个字典数组。您的 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">
<array>
    <dict>
        <key>winner</key>
        <string>Scott</string>
        <key>personChosen</key>
        <string>Female</string>
        <key>winType</key>
        <string>2 and &apos;Won&apos; -3 pts.</string>
        <key>Points</key>
        <string>3</string>
    </dict>
    <dict>
        <key>winner</key>
        <string>Emily</string>
        <key>personChosen</key>
        <string>Male</string>
        <key>winType</key>
        <string>All The Way! -5 pts.</string>
        <key>points</key>
        <string>5</string>
    </dict>
</array>
</plist>

【讨论】:

提问者确实提到“在试图弄清楚的过程中,我将 plist 中的数据更改为单个 NSDictionary 而不是包含字典的数组。然后我将 plist 加载到 NSDictionary 中……”。查看提问者尝试与 NSArray 一起使用的原始 plist 会有所帮助。 @PeterHosey 我的印象是问题中的plist 原始plist。修改后的 plist(只有一个字典)未显示在问题中。 也很有可能。只有@scottD 可以解决歧义。 @Sebastain Celis- 非常感谢您指出这一点。我不知道我是如何将字典作为根对象的,而且更困惑的是我在写问题时没有看到它。当我回到我的电脑时,我会更改代码,我相信它会是解决方案。再次感谢您的帮助! @Peter Hosey-感谢您的观看。抱歉,我从问题中遗漏了一些信息。再次感谢。

以上是关于无法将 Plist 中的数据加载到数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何将plist中的字符串加载到uitableview中

swift 将数据从.plist加载到数组

将 plist 加载到核心数据中

无法将 plist 加载到 NSArray

将 plist 数据加载到 UITableView 时从不调用惰性初始化程序

如何将xml加载到plist