• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Verschachtelte plist-Dateien auslesen (property list)

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Momentan nutze ich folgende Funktion, um was aus einer Plist zu lesen. Doch wie bekomme ich es hin, dass ich auch tiefere Verschachtelungen lesen kann?

Code:
on getProperty(thePath, theProperty)
	try
		set thePath to POSIX path of thePath
	end try
	try
		if thePath does not contain ".plist" then
			set thePath to thePath & "/Contents/Info.plist"
		end if
		tell application "System Events"
			set propList to property list file thePath
			tell propList
				get value of property list item theProperty
			end tell
		end tell
	on error
		return "0"
	end try
end getProperty
 

Anhänge

  • Bildschirmfoto 2009-10-23 um 01.18.14.png
    Bildschirmfoto 2009-10-23 um 01.18.14.png
    29,2 KB · Aufrufe: 155
Hm, ich bin da immer recht faul und lese die entsprechenden Dateien ein und such mit 'nem regulaeren Ausdruck nach dem, was ich haben will.

Ansonsten waere Rekursion noch ein Thema fuer dich.
 
nem regulaeren Ausdruck
Bitte nicht, denn das hat nichts mit Plist lesen zutun.

Du holst Dir einfach jeweils den Eintrag mit dem passenden Namen.
-whose Name sollte/wird funktionieren.

Bedenke, dass Du immer eine Liste aka NSArray als Ergebnis geliefert bekommst.

Viele Grüße
 
aber wenn ich whose name is "path" verwenden, bekomme ich ja mehr als nur ein Ergebnis, oder? Zudem möchte ich auch Werte ändern.
 
Ja genau, deshalb schrieb ich, dass Du eine Liste als Ergebnis bekommst.
Du mußt Dich dann durch hangeln, z.B. mit einer Schleife.

Zudem möchte ich auch Werte ändern.
Du kannst einfach -set auf das property item anwenden.

Viele Grüße
 
Danke, werde mich dann mal daran versuchen.
 
Dann sollte man die Leute nicht in die Irre führen und falsche Informationen verbreiten ;)
 
Es ist auch falsch zu behaupten, dass seien falsche Informationen, weil moeglich ist es damit.
Aber du hast es ihm ja jetzt erklaert. :)
 
Was spricht gegen den Plist-Editor der bei XCode dabei ist?
 
Wenn er seine entwickelte Applikation öffnet, schließt usw. soll sicherlich nicht der Plist-Editor auf und zu gehen :D

Er möchte sicherlich zu Laufzeit der Applikation Daten lesen, schreiben, löschen usw.

Viele Grüße
 
Wenn er seine entwickelte Applikation öffnet, schließt usw. soll sicherlich nicht der Plist-Editor auf und zu gehen :D

Er möchte sicherlich zu Laufzeit der Applikation Daten lesen, schreiben, löschen usw.

Viele Grüße

Achso! Darum gehts! Das wurde jez vom ersten post nicht so klar.
 
Wie im Screenshot zu sehen, möchte ich gerne Lexikon-Plugins automatisiert aktivieren und zwar nach der Installation, so dass der Anwender sich nicht fragen muss, ob da bei der Installation nicht was schiefging.
 
Hallo!

Hier mal 2 mögliche Wege am Beispiel von Safari.app

Code:
tell application "System Events"
	set propList to property list file "/Applications/Safari.app/Contents/Info.plist"
	
	tell propList
		get value of property list item 1 of property list item "CFBundleTypeExtensions" of property list item 2 of property list item "CFBundleDocumentTypes"
	end tell
end tell

Code:
tell application "System Events"
	set propList to property list file "/Applications/Safari.app/Contents/Info.plist"
	
	get value of property list item 1 of property list item 1 of property list item 2 of property list item "CFBundleDocumentTypes" of propList
	
end tell

Gruß
 
  • Like
Reaktionen: Nathea
Es ist auch falsch zu behaupten, dass seien falsche Informationen, weil moeglich ist es damit.
Aber du hast es ihm ja jetzt erklaert. :)

Es ist schon eine fehlführende Information, weil RegEx nichts mit der Struktur der Plists zu tun haben. Da hat little Pixel absolut Recht. Das ist auch unabhängig von der Sprache.
 
Danke sedna. So ähnlich hatte ich das auch versuchte, weiß aber nicht mehr was du jetzt anders gemacht hast. Der direkte Zugriff klappt damit.

Ich will aber vorher noch prüfen, ob und wo ein Eintrag schon existiert. Folgender Versuch schlägt fehl:

Code:
tell application "System Events"
	set propList to property list file ((POSIX path of (path to home folder) as string) & "/Library/Preferences/com.apple.Dictionary.plist")
	
	set dicts to (value of property list item "dictionaries" of property list item 1 of property list item "window settings" of propList)
	
	repeat with dict in dicts
		log (item 2 of dict)
	end repeat
	
end tell

Es kommte die Meldung:
Ergebnis:
error "„item 2 of {|disclosure opened|:true, |path|:\"/Library/Dictionaries/New Oxford American Dictionary.dictionary\", |user choice|:true}“ kann nicht gelesen werden." number -1728 from item 2 of {|disclosure opened|:true, |path|:"/Library/Dictionaries/New Oxford American Dictionary.dictionary", |user choice|:true}

Hätte Apple einen vernünftigen Installer, müsste ich mich mit dem Scheiß hier nicht rumschlagen. Bin echt gefrustet.

Im Grunde will ich ein:

get (property list item whose property list item "path" contains "XYZ") of property list item "dictionaries" of property list item 1 of property list item "window settings" of propList)

oder so ähnlich.
 
Das würde nicht so einfach funktionieren ;-)

Anbei Deine von Seite 1 gezeigte Plist und das Skript um die Werte zu setzen.
Du solltest Dir unbedingt aber ein paar Prüfungen verbauen.

Code:
(path to home folder) as string) & "/Library/Preferences/com.apple.Dictionary.plist"

Nein nein...

So ist das richtig:

Code:
path to preferences folder from user domain

Viele Grüße
 

Anhänge

  • Like
Reaktionen: Nathea
Was hat sich da jetzt ergeben? Hast Du keine Lust mehr?

Viele Grüße
 
Komme gerade erst zum testen. Bislang klappt es nicht. Muss aber auch erst mal deinen Ansatz verstehen. Vielen Dank schon mal dafür.
 
Leider greift das Skript nicht tief genug, es gibt ja noch eine Zwischenstufe zwischen dictionariers und path (item 0, item 1 …). Aber irgendwie komme ich mit einem repeat nicht ran.