• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> 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

Irgendein Held

Oberösterreichischer Brünerling
Registriert
17.06.07
Beiträge
714
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.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
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
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
aber wenn ich whose name is "path" verwenden, bekomme ich ja mehr als nur ein Ergebnis, oder? Zudem möchte ich auch Werte ändern.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
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
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Danke, werde mich dann mal daran versuchen.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Dann sollte man die Leute nicht in die Irre führen und falsche Informationen verbreiten ;)
 

Irgendein Held

Oberösterreichischer Brünerling
Registriert
17.06.07
Beiträge
714
Es ist auch falsch zu behaupten, dass seien falsche Informationen, weil moeglich ist es damit.
Aber du hast es ihm ja jetzt erklaert. :)
 

vcr80

Gestreifter Böhmischer Borsdorfer
Registriert
06.11.08
Beiträge
3.396
Was spricht gegen den Plist-Editor der bei XCode dabei ist?
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
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
 

vcr80

Gestreifter Böhmischer Borsdorfer
Registriert
06.11.08
Beiträge
3.396
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.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
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.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
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

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
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.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
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

  • Neuer Ordner.zip
    3,6 KB · Aufrufe: 71
  • Like
Reaktionen: Nathea

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Was hat sich da jetzt ergeben? Hast Du keine Lust mehr?

Viele Grüße
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Komme gerade erst zum testen. Bislang klappt es nicht. Muss aber auch erst mal deinen Ansatz verstehen. Vielen Dank schon mal dafür.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
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.