1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

OPML nach Ordnerstruktur konverter

Dieses Thema im Forum "AppleScript" wurde erstellt von Sarah Nyn, 15.07.07.

  1. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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
     
    #1 Sarah Nyn, 15.07.07
    Zuletzt bearbeitet: 15.07.07
  2. schnydi

    schnydi James Grieve

    Dabei seit:
    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!
     
  3. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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.
     
  4. Messerjokke79

    Messerjokke79 Eifeler Rambour

    Dabei seit:
    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.
     
  5. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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
     
  6. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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.
     
  7. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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.
     
  8. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    XSLT ist gerade für das umschreiben von XML Datei konzipiert.
    Hier was zu XSLT 1.0 (deutsch)
    und zu 2.0 (english)
     
  9. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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.
     
  10. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Mit 2.0 kann man (im Gegensatz zu 1.0) mehrere Ausgabedateien schreiben. Wenn ich mich nicht sehr irre, legt saxon (der XSLT Prozessor) die angeforderten Pfad dann jeweils an.
     
  11. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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?
     
  12. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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.
     
  13. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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
     
  14. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Programm nachgereicht

    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:
     
    #14 Skeeve, 16.07.07
    Zuletzt bearbeitet: 16.07.07
  15. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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
     
  16. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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:
     
  17. Sarah Nyn

    Sarah Nyn Kaiser Wilhelm

    Dabei seit:
    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
     

Diese Seite empfehlen