• 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

OPML nach Ordnerstruktur konverter

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Guten Morgen!

Ich frage mich gerade, wie schwierig es wäre, ein AppleScript zu schreiben, das OPML Dateien zu einer Ordnerstruktur konvertiert. OPML ist ein XML Format, also einfach zu lesen (?).

Ein OPML Dokument sieht etwa so aus:

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
<head>
<title>opml</title>
<expansionState>0,2</expansionState>
</head>
<body>
<outline text="level one">
<outline text="level two"/>
</outline>
<outline text="level one">
<outline text="level two"/>
</outline>
</body>
</opml>

Da ich keine Ahnung habe, würde ich einfach mal den Text aus der Datei als Strings einlesen und so die Struktur herausfinden. Gibt's da etwas eleganteres?

Dann müsste man dem Finder sagen, wie er die Ordner erstellen soll, geht das so einfach wie ich mir das vorstelle:innocent:?
Edit: Ansonsten müsste das auch über's Terminal gehen.

Dankeschön!

Grüsse,
iSarah
 
Zuletzt bearbeitet:

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Mit System Events -> XML Suite lassen sich XML Dateien durchaus lesen und bearbeiten. Allerdings sehe ich keine Ordnerstruktur in deinem Beispiel, allerdings habe ich auch keine Ahnung was OPML ist.

Ein Beispiel für XML Daten (Mit einer Sitemap einer Webseite für Google)
Zuerst das XML file:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="http://www.google.com/schemas/sitemap/0.84"
 sitemap.xsd">
 <url>
  <loc>http://web.mac.com/cine4mac/iWeb/CineMac/CineMac.html</loc>
  <priority>0.5000</priority>
 </url>
 <url>
  <loc>http://web.mac.com/cine4mac/iWeb/CineMac/Designs.html</loc>
  <priority>0.5000</priority>
 </url>
</urlset>
Und das AppleScript:
Code:
tell application "System Events"
	set XMLfile to XML file "/Users/ps/Desktop/sitemap.xml"
	set XMLdata to name of XML elements of XML element 1 of XMLfile
end tell
Resultat: {"url", "url"}

PS:Guten morgen um 20:09Uhr?:-D Na du hatest aber eine anstrengende Nacht!
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Danke, das guck ich mir mal an.

Die Namen der Ordner sollen hier <outline text="..."> ... entsprecher und die Struktur soll nach der Hierarchie dieser <outline> Dinger gebildet werden.

PS: Irgendwo ist jetzt bestimmt Morgen.
 

Messerjokke79

Eifeler Rambour
Registriert
21.07.06
Beiträge
600
«MacFuse» von Google(-Mitarbeiter; suche es mit Google dann findest du es sofort) kann verschiedene Formate als Dateisystem einlesen.
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Eine Frage noch (oder später auch noch mehr...)

Wie komme ich an den text zwischen <title> und </title> ?
<title>text</title>

Irgendwo hab ich etwas mit value gelesen, hab's aber noch nicht hinbekommen.

Dankeschön!
iSarah
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Muß es AppleScript sein?

Mit meinem NEAT 4 Saxon (willst Du Beta Tester werden) kannst Du es per XSLT 2.0 in was auch immer konvertieren.
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Nun, nein, es muss nicht AppleScript sein. Nur ist das das einzige, von dem ich den Hauch einer Ahnung habe wie das funktionieren könnte. XSLT 2.0 hatte ich bis gerade eben noch nie gehört.
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Ich stelle mich vermutlich etwas blöd an und ich habe mir noch nicht wirklich Zeit genommen, aber ich sehe nicht, wie man damit zur Ordnerstruktur kommt. Interagiert XSLT irgendwie mit dem Dateisystem? Ich möchte ja nicht einfach ein anderes XML nachher.
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Nactrag: Dein Beispiel entspricht dieser Struktur:
body/level one/level two
body/level one/level two
Wie soll hier denn verfahren werden, wenn die Verzeichnisse gleich benamst sind?
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Ja, blödes Beispiel. Da hab ich nicht wirklich nachgedacht, wenn's gleich ist soll es von mir aus in den gleichen Ordner, ist aber eher die Ausnahme.
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Hmm, mit AppleScript kam ich jetzt immerhin schon soweit, dass ich die erste Ebene in Ordner umwandeln kann und zwar hiermit:

tell application "System Events"
set XMLfile to XML file "/Users/yn/desktop/opml.opml"
set fn1 to value of XML attribute 1 of XML elements of XML element 2 of XML element 1 of XMLfile
end tell

tell application "Finder"
make new folder at desktop with properties {name:"OPML"}
repeat with x from 1 to number of items in fn1
make new folder at ((desktop as text) & "OPML") with properties {name:item x of fn1}
end repeat
end tell

Bitte nicht auslachen. Wobei ich natürlich glücklich wäre, etwas zur allgemeinen Erheiterung beizutragen. Wie auch immer.

Ich glaube den Rest krieg ich jetzt auch noch hin.

iSarah
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Programm nachgereicht

Bitte nicht auslachen.
Im Gegenteil... Schon beeindruckend, wie weit Du gekommen bist. Ich breche mir mit diesen AppleScript Extensions immer einen ab.

Allerdings solltest Du das ganze rekursiv aufziehen, also mindestens mal einen Handler einbauen für die outline-elemente.

Ich habe mich mal dran versucht. Da ich es mit dem Finder nicht so habe, bin ich allerdings zum Anlegen der Verzeichnisse auf die Shell ausgewichen:
on run
   set dsk to POSIX path of (path to desktop folder)
   tell application "System Events"
      set XMLfile to XML file (dsk & "opml.opml")
      set root to XML element 1 of XMLfile
      set body to XML element "body" of root
      my make_structure(body, dsk & "OPML/")
   end tell
end run

to make_structure(parent, current_path)
   set done to false
   tell application "System Events"
      repeat with elt in (every XML element of parent whose name is "outline")
         my make_structure(elt, current_path & (value of XML attribute "text" of elt) & "/")
         set done to true
      end repeat
   end tell
   if not done then
      do shell script "mkdir -p " & quoted form of current_path
   end if
end make_structure
 
Zuletzt bearbeitet:

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
Mit Skeeves ausgiebiger Unterstützung habe ich nun ein für mich praktikables Skript erstellt. Es exportiert das aktuelle OmniOutliner Dokument, speichert dieses unter home/opml/opml.opml , fragt dann nach einem Zielordner und erstellt dort die Ordnerstruktur gemäss dem Outline. Es ist ein zimlicher Murks (was ausschliesslich an mir liegt), aber es funktioniert.

Hier der Code:

Code:
set homefolder to POSIX path of (path to home folder)

tell application "OmniOutliner"
	export document 1 to homefolder & "opml/opml.opml" as "OOOPMLDocumentType"
end tell

set selected_path to (choose folder) as string
set destination to "/"
repeat with x from 14 to number of characters of selected_path
	if character x of selected_path is ":" then
		set destination to destination & "/"
	else
		set destination to destination & character x of selected_path
	end if
end repeat

set input_path to homefolder & "opml/"
tell application "System Events"
	set XMLfile to XML file (input_path & "opml.opml")
	set root to XML element 1 of XMLfile
	set body to XML element "body" of root
	my make_structure(body, destination)
end tell

to make_structure(parent, current_path)
	set done to false
	tell application "System Events"
		repeat with elt in (every XML element of parent whose name is "outline")
			my make_structure(elt, current_path & (value of XML attribute "text" of elt) & "/")
			set done to true
		end repeat
	end tell
	if not done then
		do shell script "mkdir -p " & quoted form of current_path
	end if
end make_structure

Dankeschön!
iSarah
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Es ist ein zimlicher Murks (was ausschliesslich an mir liegt), aber es funktioniert.
Naja... Solange:
  1. Der Name Deiner Bootplatte mindestens 14 Zeichen lang ist
  2. Du keinen / im Dateinamen hast (der muß nämlich durch : ersetzt werden)
Ich habe den ersten Teil überarbeitet allerdings nicht getestet:
on run
   set homefolder to POSIX path of (path to home folder)
   
   -- hier würde ich das temp-Verzeichnis wählen
   set tempfile to (path to temporary items) & "opml.opml"
   tell application "OmniOutliner"
      export document 1 to (POSIX path of tempfile) as "OOOPMLDocumentType"
   end tell
   
   set selected_path to (choose folder) as string
   -- Was Du hier möchtest ist
   set destination to POSIX path of selected_path
   
   tell application "System Events"
      set XMLfile to XML file tempfile
      set root to XML element 1 of XMLfile
      set body to XML element "body" of root
      my make_structure(body, destination)
   end tell
   
   -- nicht vergessen! AUFRÄUMEN!
   do shell script "rm -f " & quoted form of (POSIX path of tempfile)
end run
 

Sarah Nyn

Kaiser Wilhelm
Registriert
02.06.07
Beiträge
177
AUFRÄUMEN? Nee. Immer diese Ordnungsfanatiker.

Ernsthaft, ich finde es nicht schlecht das letzte File noch rumliegen zu haben. Vielleicht behalte ich auch alle, als Backup.

Ansonsten treffen deine Zeilen mal wieder auf grenzenlose Begeisterung :-D

Ein weiteres Dankeschön!

iSarah