06.11.2011

Einlesen und Schreiben von Property Listen (plist) mit Objective-C

Die plists sind eine Möglichkeit Konfigurationsdateien oder andere Daten auf dem Mac abzulegen. Mit Objective-C lassen sich diese sehr einfach in Datenstrukturen einlesen und wieder auf die Platte schreiben. Die plist-Dateien können als XML- oder Binärdateien vorliegen. Außerdem wird ein "old-style" ASCII-Format lesend unterstützt. Zum Öffnen von plists im Binärformat wird der plist-Editor benötigt, der mit Xcode installiert wird. Das XML- und ASCII-Format läßt sich mit jedem Texteditor öffnen.

So könnte eine plist-Datei aussehen, die Vokabeln enthält. Zwei Einträge sind einfach Key-Value-Paare bei denen der Value vom Type string ist. Bei dem dritten Eintrag ist der Value vom Type array und enthält zwei String-Werte.


<?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>milk</key>
	<string>Milch</string>
	<key>oats</key>
	<string>Hafer</string>
	<key>home</key>
	<array>
		<string>Heim</string>
		<string>Heimat</string>
	</array>
</dict>
</plist>

Da die Ansicht als XML-Datei schnell unleserlich wird, besteht die Möglichkeit sich die plist-Datei in einem eigenen plist-Viewer innerhalb von Xcode anzusehen. Wenn eine plist-Datei vom Finder aus geöffnet wird, dann öffnet sich der plist-Viewer automatisch.

Lesen von plists

Um so eine plist-Datei in ein NSDictionary einzulesen, reichen folgende Befehle aus:

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Vokabeln" ofType:@"plist"];
NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

Es wird davon ausgegangen, daß die Datei innerhalb des Xcode-Projekts liegt und Vokabeln.plist heißt.

Zur Kontrolle kann man das NSDictionary folgendermaßen ausgeben:

// Ausgabe des NSDictionary
id aKey;
for (aKey in dic) {
    NSLog(@"%@ = %@", aKey, [dic objectForKey:aKey]);
} 

Schreiben von plists

Falls man plant die geladene plist-Datei zu ändern, kann man die Daten beim Laden in ein NSMutableDictionary laden, damit das Ändern möglich ist.

In dem folgenden Beispiel wird eine plist-Datei in eine NSMutableDictionary geladen und es wird ein Eintrag hinzugefügt. Danach wird die Datei unter einem anderen Namen wieder auf die Platte geschrieben.

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Vokabeln" ofType:@"plist"];
NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
 
[dic setObject:@"Hund" forKey:@"dog"];

[dic writeToFile:[@"~/Documents/Vokabeln2.plist" stringByExpandingTildeInPath] atomically:TRUE];

Zu beachten ist, daß die Methode stringByExpandingTildeInPath aufgerufen werden muß, falls der Pfad eine Tilde enthält.