• 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)

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Wie meinst Du das?
Das ist doch genau die Struktur, so wie Du sie zu Beginn gezeigt hast. Oder?

Viele Grüße
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Nein, leider nicht. Unter Dictionaries sind bei mir 4 namenlose Items welche jede 3 benannte Unteritems wie eben "path" haben.

Würde repeat oder as string mit property list items funktionieren, könnte ich mir evtl. was zurechtmogeln. Habe mich schon mal bei MacRuby umgeschaut, aber da steige ich wohl auch nicht so schnell ein.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
[…] Unter Dictionaries sind bei mir 4 namenlose Items welche jede 3 benannte Unteritems wie eben "path" haben.

Würde repeat ... mit property list items funktionieren, könnte ich […]

Warum sollte es das nicht?
Ich denke mal, dass dir Little Pixel auch hier weiter helfen kann (zur Not springe ich ein :p) ...
aber ich vermute, dass das immer noch nicht das Ende ist.

WAS genau hast Du vor? Möchtest du die Werte der "path" childs ändern?
Nach dem Motto, wenn der Wert so ist, dann ändere ihn in soundso?

Und überhaupt! Gibt es eventuell nicht einen viel eleganteren Weg, dein Problem zu lösen (welches du so ja auch noch nicht klar dargelegt hast - ich reime es mir gerade zusammen)

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

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Verstehe ich nicht. Das funktioniert doch alles.
Auf Grund des Beispiels sollte doch alles klar sein, da alles wie Lesen und Schreiben enthalten ist.

Warum sollte man keine Schleife verwenden können?
Das funktioniert ebenfalls.

Besser:
Warum schreibst Du Dir nicht eine kleine Cocoa/Objecktive-C Klasse?
Damit ist es nochmals trivialer und schneller.

Viele Grüße
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Ja, dein Beispiel funktioniert, aber deine plist-Datei entspricht nicht dem Original. Ich habe mal eine korrekte Datei angehängt.

Ich würde ja gerne den ganzen Installer in Obj-C machen, aber dazu fehlt mir einfach das Grundwissen und die Zeit.

Im Prinzip soll das Skript ein installiertes Plugin auch automatisch aktivieren, so das der Anwender nicht denkt bei der Installation sei was schief gelaufen. Seit SL, muss man da zusätzlich noch was in die com.apple.dictionary.plist schreiben (ein item unter window settings/item 1/dictionaries). Ich möchte gerne nur dann was reinschreiben, wenn es nicht schon existiert. Es würde zwar auch so funktionieren, aber nach 10 Installationen steht der Eintrag dann auch 10 mal drin und ich weiß nicht ob das vielleicht doch zu Problemen führen könnte. Auch wenn ich den Installer vielleicht nicht sauber hingerotzt bekomme, soll er zumindest ein sauberes Ergebnis liefern.

Ich könnte auch einfach wie früher den Plugin-Ordner oder ein Package ausliefern, aber ich habe keinen Bock ständig Mails zu beantworten, weil die Leute nicht lesen wollen.

Sorry für meine etwas schroffen „Ton“, bin echt gefrustet. Und danke für eure Geduld.
 

Anhänge

  • ASTest.plist.zip
    850 Bytes · Aufrufe: 80

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Warum hast Du es Dir nicht angepasst?

Code:
set newValueOfTargetDisclosureOpened to false
set newVlaueOfTargetPath to "/the/new/location"

set locationToPlist to POSIX path of (choose file)

tell application "System Events"
	
	set propList to property list file locationToPlist
	
	set dicNode to property list item "dictionaries" of property list item 0 of property list item "window settings" of propList
	
	set dicNodeItems to (every property list item of dicNode)
	
	if ((count of dicNodeItems) > 1) then
		
		set targetItem2 to item 2 of dicNodeItems
		
		set targetDisclosureOpened to item 1 of (every property list item of targetItem2 whose name is equal to "disclosure opened")
		set targetPath to item 1 of (every property list item of targetItem2 whose name is equal to "path")
		
		-- das sind die Ergebnisse
		-- value of targetPath
		-- value of targetPath
		
		-- neue Werte setzen?
		-- set value of targetDisclosureOpened to newValueOfTargetDisclosureOpened
		-- set value of targetPath to newVlaueOfTargetPath
		
	else
		-- item 2 ist nicht vorhanden > anlegen?
	end if
	
end tell

Ich habe zwar immer noch nicht das Ziel genau verstanden, aber das kannst Du Dir ja selbst anpassen.

Viele Grüße
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Vielen Dank, das hat mich dann doch auf den richtigen Weg gebracht. Mit repeat with in klappte es nicht, aber mit dem count ging es dann doch. Mein Problem ist ja, dass ich nicht weiß in welchem item mein Eintrag stehen könnte, da es abhängig von der Anzahl der installierte Plugins ist.

Hier das funktionierende Skript-Schnipselchen:
Code:
set newDisclosureOpened to true
set newTargetPath to "/the/new/location3"

set locationToPlist to POSIX path of (choose file)

tell application "System Events"
	
	set propList to property list file locationToPlist
	
	set dicNode to property list item "dictionaries" of property list item 0 of property list item "window settings" of propList
	
	set dicNodeItems to (every property list item of dicNode)
	
	set pathFound to false
	
	repeat with i from 1 to (count of dicNodeItems)
		set targetItem2 to item i of dicNodeItems
		
		set targetDisclosureOpened to item 1 of (every property list item of targetItem2 whose name is equal to "disclosure opened")
		set targetPath to item 1 of (every property list item of targetItem2 whose name is equal to "path")
		
		if value of targetPath is equal to newTargetPath then
			set pathFound to true
			set value of targetDisclosureOpened to true
			exit repeat
		end if
		
	end repeat
	
	if pathFound is false then
		set newItem to make new property list item at end of dicNode with properties {kind:record}
		make new property list item at end of newItem with properties {kind:boolean, name:"disclosure opened", value:newDisclosureOpened}
		make new property list item at end of newItem with properties {kind:string, name:"path", value:newTargetPath}
	end if
end tell