XML-Datei mit intelligenten Regeln bearbeiten

Hi,

ist es möglich XML-Dateien mit Apple Script über intelligente Regel zu bearbeiten, sodass die XML-Struktur nicht “zerstört” wird?

Wenn ich es mit automatischen Textersetzungen mache, dann wird daraus eine Textdatei. Leider habe ich keine Möglichkeit gefunden, den Suffix mit DT zu ändern (mit dem Finder geht das ohne Weiteres).

Ich muss lediglich die Attribute unter <common_header>:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 ...
  <dictation>
    <author>
      ...
    </author>
    <common_header>
      <author_id>
      </author_id>
      <attribute_flag>FF</attribute_flag>
      <licensee_id>
      </licensee_id>
      ...
    </common_header>

in das

          <author_id>Autor</author_id>
          <attribute_flag>FF</attribute_flag>
          <licensee_id>00000002</licensee_id>

ändern.

Ich bin mit meinen beschränkten Möglichkeiten leider am Ende.

Vielleicht hat jemand eine Idee. Danke im Voraus!

VG,
Chris

Ist die Struktur sonst intakt? Also würde es dir reichen, den Suffix wieder in .XML zu ändern? (Mit tell Finder wäre das ja möglich, wobei die Datei letztlich dann kopiert, umbenannt und reimportiert gehört, denke ich - Dateien innerhalb der Datenbankstruktur sollen nicht von extern geändert werden, wenn ich diverse Posts hier im Forum richtig im Kopf habe; aber das wäre ja machbar)

Man kann das vermutlich mit AppleScript machen. Wollen würde ich das nicht. Alternativ bietet sich Shell-Script an, dass einen XSLT-Prozessor aufruft. Oder Python: Datei mit XML-Parser einlesen, die passenden Stellen ändern und wieder rausschreiben.
Andererseits ist DT vielleicht nicht ganz das Richtige für XML-Verarbeitung.

Ich hatte nicht erwähnt, dass die Dateien indiziert sind. Da müsste zumindest nicht reimportiert werden …

Mit “tell Finder” habe ich mit meinen wenigen Kenntnissen auch nicht viel erreicht … :confounded:

Probierst du das mal, ob das was du bisher in DT erreicht hast funktionieren würde, wenn nur der Suffix passen würde? Dann bastel ich morgen dran, den Suffix mittels tell Finder zu ändern - das müsste gehen :slight_smile:

Ich hatte über das Terminal mit folgenden Befehlen Erfolg:

sed -i.bak "s=      </author_id>==g" 111.xml
sed -i.bak "s=<author_id>=<author_id>A1</author_id>=g" 111.xml

So gehts natürlich auch, vermutlich könnte man das auch in ein sed-Kommando packen: sed -e s… -e s…
Ich würde die Leerzeichen mit \s+ kodieren, das ist stabiler als sie abzuzählen. Dann musst du sed -E benutzen.

Das geht ohne Weiteres, wenn ich das im Finder per Hand ändere. Danke für eure Hilfe!

Los geht’s:

on performSmartRule(theRecords)
	tell application id "DNtp"
		repeat with theRecord in theRecords
			
			-- the following assumes theRecord is an indexed file; as such, theRecord will point to the original file you are working on, but possibly not to the altered file which receives a txt-Extension when you edit it with your section of the script.
			
			set thePath to path of theRecord as string -- find the current path of theRecord
			if texts ((length of thePath) - 2) thru -1 of thePath is "xml" then -- only act on xml files
				set thePath to texts 1 thru ((length of thePath) - 3) of thePath -- remove the extension from the path
				set thePath to thePath & "txt" -- add txt extension to the path
				
				-- add whatever you do to change your xml file here
				
				tell application "Finder"
					set name extension of item (thePath as POSIX file) to "xml" -- change the extension of the original file back to xml
				end tell
			end if
		end repeat
	end tell
end performSmartRule

Probier das mal aus; bitte fasse deine SmartRule präzise und eng - am besten am Anfang auf einen spezifischen Ordner und einen spezifischen Dateinamen bezogen, um zu prüfen ob alles funktioniert. In der Mitte bei add whatever you do to change your xml file here fügst du die Scriptanteile ein, die du bisher zur Bearbeitung deiner xml-Dateien verwendet hast.

Das Script geht von folgendem aus: die Datei, die du bearbeiten willst, ist indexed und nicht importiert. Das hat interessante Konsequenzen, weil in dem Moment wo dein bisheriges Script die Datei editiert und sie von xml in txt umwandelt eine neue Datei mit einer neuen Datei-id vorliegen könnte - die Variable “theRecord” bezieht sich dann nicht mehr auf deine Datei. Im Prinzip besteht auch die Möglichkeit einer Endlosschleife - je nachdem wann DT die Liste “theRecords” definiert. Wir erzeugen nämlich mit dem Script ein neues Dokument mit einer .xml Endung, das - wenn deine Regel sich z.B. weit offen einfach nur auf xml-Dateien bezieht, wieder in die Regel einbezogen werden könnte. Ich nehme an, dass du schon bisher deine Regel so gefasst hast, dass geänderte Dokumente nicht mehr bearbeitet werden - jedenfalls ist das jetzt sinnvoll und möglicherweise erforderlich (es aber kann sein, dass SmartRules mit dem Moment der Ausführung die Liste der zu bearbeitenden Dokument festlegen und unter der Ausführung nicht mehr anpassen; dann gäbe es so oder so kein Risiko einer Endlosschleife).

Wenn alles funktioniert, kannst/musst du vielleicht noch zum Ende der Regel (also zwischen end repeat und end tell noch ⌥ ⌘S an DT schicken - das würde die Übersicht der indexed Dateien aktualisieren [direkt scriptbar ist das soweit ich erkennen kann nicht, aber es müsste möglich sein, die Tastenkombination an DT zu schicken]); das kommt tatsächlich darauf an, ob DT die durchgeführten Änderungen zum Anlass nimmt, eine neue Datei zu erkennen (meine Experimente hierzu waren nicht schlüssig; gerne Rückmeldung von dir).

PS das Script ist als Embedded-Script geschrieben. Falls du es als externen Script laufen lässt, muss texts in text geändert werden. Why ever.

Disclaimer: ich habe dieses Script soweit möglich getestet. Es nimmt Änderungen an Dateinamen vor, und hat das Potential Schaden anzurichten. Soweit ich es ohne deine Scriptanteile testen konnte, funktioniert es und tut nichts schlimmes; für die Anwendung übernehme ich aber keine Verantwortung.

Super! Vielen Dank, hat sehr gut funktioniert. Ich habe das Skript einfach separat nach den anderen Aufgaben als eingebettetes Skript hinzugefügt. Lediglich die if-Schleife habe ich entfernt.

Danke für deine Zeit!