2009-04-14 70 views
49

我創建一個數據結構手動使用以下:如何讀取的.plist文件中的數據結構到NSArray的

NSDictionary* league1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Barclays Premier League", @"name", 
       @"Premier League", @"shortname", 
       @"101", @"id", nil]; 
NSDictionary* league2 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Coca-Cola Championship", @"name", 
       @"Championship", @"shortname", 
       @"102", @"id", nil]; 
NSDictionary* league3 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish Premier League", @"name", 
       @"SPL", @"shortname", 
       @"201", @"id", nil]; 
NSDictionary* league4 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Champions League", @"name", 
       @"UCL", @"shortname", 
       @"501", @"id", nil]; 

contentArray = [[NSArray alloc] initWithObjects: 

       [[NSDictionary alloc] initWithObjectsAndKeys: @"English", @"category", [[NSArray alloc] initWithObjects: league1, league2, nil], @"leagues", nil], 
       [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish", @"category", [[NSArray alloc] initWithObjects: league3, nil], @"leagues", nil], 
       [[NSDictionary alloc] initWithObjectsAndKeys: @"Tournaments", @"category", [[NSArray alloc] initWithObjects: league4, nil], @"leagues", nil], 
       nil]; 

[league1 release]; 
[league2 release]; 
[league3 release]; 
[league4 release]; 

不過,我認爲這將是更好的,如果它是從文件中讀取。所以,我創建了具有以下結構的文件leagues.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>category</key> 
      <string>English</string> 
      <key>leagues</key> 
      <array> 
       <dict> 
        <key>name</key> 
        <string>Barclays Premier League</string> 
        <key>shortname</key> 
        <string>Premier League</string> 
        <key>id</key> 
        <string>101</string> 
       </dict> 
       <dict> 
        <key>name</key> 
        <string>Coca-Cola Championship</string> 
        <key>shortname</key> 
        <string>Championship</string> 
        <key>id</key> 
        <string>102</string> 
       </dict> 
      </array> 
     </dict> 
     <dict> 
      <key>category</key> 
      <string>Scottish</string> 
      <key>leagues</key> 
      <array> 
       <dict> 
        <key>name</key> 
        <string>Scottish Premier League</string> 
        <key>shortname</key> 
        <string>SPL</string> 
        <key>id</key> 
        <string>201</string> 
       </dict> 
      </array> 
     </dict> 
     <dict> 
      <key>category</key> 
      <string>Tournaments</string> 
      <key>leagues</key> 
      <array> 
       <dict> 
        <key>name</key> 
        <string>Champions League</string> 
        <key>shortname</key> 
        <string>UCL</string> 
        <key>id</key> 
        <string>501</string> 
       </dict> 
      </array> 
     </dict> 
    </array> 
</plist> 

如何讀取我已經嘗試了各種方法,但沒有奏效這一文件。我甚至不知道我是否在正確的位置查找文件。作爲參考,我嘗試以下方法:

NSString* errorDesc = nil; 
NSPropertyListFormat format; 
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; 
NSData* plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
contentArray = (NSArray*)[NSPropertyListSerialization 
            propertyListFromData:plistXML 
            mutabilityOption:NSPropertyListMutableContainersAndLeaves 
            format:&format 
            errorDescription:&errorDesc]; 

if (!contentArray) { 
    NSLog(errorDesc); 
    [errorDesc release]; 
} 

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; 
contentArray = [NSArray arrayWithContentsOfFile:plistPath]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 

NSString *fooPath = [documentsPath stringByAppendingPathComponent:@"leagues.plist"]; 
NSLog(fooPath); 
contentArray = [NSArray arrayWithContentsOfFile:fooPath]; 
NSLog(@"%@",contentArray); 

這終於讓我徹底瘋了。請幫助!

太感謝您了

回答

121
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; 
contentDict = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 

這個答案是正確的 - 你確定你的文件是在應用程序?你是否將它添加到你的項目中,並檢查它是否被複制到你的應用程序包中?如果不是,可能是該文件沒有添加到您正在構建的目標中,這是一個很容易犯的錯誤,特別是如果您有多個目標。

+0

剛學在這裏:)。我不知道它是否在主包中。謝謝,我會檢查下。 – Xetius 2009-04-15 06:47:34

+1

這是:[[NSDictionary dictionaryWithContentsOfFile:plistPath];' – shebelaw 2014-09-04 16:45:24

+0

謝謝@shebelaw,我調整了代碼。認爲這是一個數組... – 2014-09-04 20:04:06

2

肯德爾是正確的。

根據我的經驗,您需要將您的文件添加到xcode中的「Resources」文件夾中。

+0

資源文件夾內的文件夾怎麼樣?它也可以添加嗎? – Patricia 2010-10-28 20:41:09

+0

@Patricia沒關係,只要確保它是相對於組。 – Kjuly 2012-02-05 08:10:44

2

爲了完整性,Kendall和bentford是完全正確的。但是,在我的示例中,contentArray是一個屬性,在方法結束時它將超出範圍,因爲arrayWithContentsOfFile創建了一個自動釋放對象。

要正確地做這項工作,我需要做三件事情:

  1. 把文件中的資源文件夾

  2. 名稱正確的文件(是leagues.plist代替league.plist的)

  3. 使用讀取文件[[NSArray alloc] initWithContentsOfFile:plistPath)];

第三部分創建一個NSArray的分配,當你退出這個功能......當然的範圍內,不會釋放,這需要在dealloc的功能被釋放。

+0

autorelease的事情..你可以在適當的時候「保留」。 – dwery 2010-07-23 05:42:51

0

只需添加。我有同樣的問題,建議的解決方案幫助我解決了這個問題,但是我不確定我是否真的使用了確切的解決方案。在我的情況下,問題是.plist文件被添加到不同的目標(之前添加了一個新的目標)。因此解決方案是.plist> Get Info> Targets,並確保將其添加到正確的目標,以便在安裝時將其複製到設備。我很快就知道了,我會節省很多時間。希望這也有幫助。問候!

4

如果plist位於項目的資源文件夾中,請使用此代碼。

NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"]; 
contentArray = [NSArray arrayWithContentsOfFile:sourcePath]; 

如果plist是內部應用程序的文件目錄使用:

NSArray *paths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 

NSString *plistName = @"league"; 
NSString *finalPath = [basePath stringByAppendingPathComponent: 
         [NSString stringWithFormat: @"%@.plist", plistName]]; 



contentArray = [NSArray arrayWithContentsOfFile:finalPath]; 
4

我有這個問題,但它是行不通的,因爲我把結果從plist中到一個數組它應該是一個字典,即

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"VehicleDetailItems" ofType:@"plist"]; 
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
0

如果該文件沒有添加到資源文件夾中,並且只放置在您的文檔目錄中。 你可以做到這一點

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.plist"]; 
NSMutableArray *arrContentsplist = [[NSMutableArray alloc] initWithContentsOfFile:path]; 
0

此代碼工作

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"]; 
NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath]; 
NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);