2 votes

Changer les données de plusieurs champs XML et les données ont un nom différent #ont essayé Apple Script #sur Mac

Description du scénario

Ce côté doit aller régulièrement sur un ftp pour télécharger les données et modifier leurs champs. Le processus est le suivant :

  1. Télécharger d'un endroit un fichier nommé "202301081014XXXX.REQ" au format de données xml
  2. Modifier les données d'un des champs de S001 dont le contenu est "1234" Changer le en "abcd"
  3. Si la modification est terminée, créer un fichier avec le même nom et le nommer "202301081014XXXX.REQ.OK" 4.Envoyer les deux données créées vers un autre chemin ftp

Actuellement, j'ai essayé l'action suivante

  1. via des outils de script d'application Mac
  2. L'opération d'enregistrement de l'écran est la suivante

    tell application "Finder" activate open document file "202301081014N1234.REQ" of folder "Downloads" of folder "blue2" of folder "Users" of startup disk using application file "BBEdit.app" of folder "Applications" of startup disk end tell tell application "BBEdit" activate open find window find "1234" searching in text 1 of text document id 829 with selecting match set characters 406 thru 428 of text document id 829 to "abcd" select insertion point after characters 406 thru 428 of text document id 829 save text document id 829 end tell

Problèmes rencontrés

Parce que les noms des données sont différents, j'ai lu les documents officiels mais je ne sais pas comment définir la portée. Et le champ est à une position différente, donc je ne peux pas exécuter le AppleScript enregistré.

0 votes

BBEdit possède un dictionnaire de scripts étendu - par exemple, la commande find renverra un enregistrement contenant une référence à la plage de caractères d'une correspondance.

0 votes

AppleScript n'est pas l'outil idéal à utiliser ici. Vous feriez probablement beaucoup mieux avec un script Bash (ligne de commande) utilisant sed ou awk pour trouver/remplacer rapidement et efficacement des éléments de texte.

0 votes

Aussi, ne collez pas une capture d'écran de votre code. Postez le texte réel et formatez-le en conséquence. Quiconque souhaite tester votre code ne pourra pas le faire à moins de le retaper manuellement. Il est peu probable que les gens veuillent faire cela.

1voto

red_menace Points 1014

Essayer d'enregistrer l'interface utilisateur est problématique au mieux, et peut inclure des déclarations superflues et différents types de références. Une meilleure option est de regarder le dictionnaire de script d'une application (si elle en a un) pour voir les fonctionnalités qu'elle expose - BBEdit prend en charge la plupart de ses fonctions.

En plus d'un identifiant, les fenêtres et les documents ont également un index, qui est leur ordre d'affichage. L'objet devant est toujours 1, on peut donc l'utiliser au lieu d'essayer de trouver un identifiant unique.

La commande find renverra un enregistrement contenant une référence à la plage de caractères d'une correspondance, et a également une option pour la sélectionner - celles-ci peuvent être utilisées au lieu des décalages de caractères codés en dur. La commande replace remplacera simplement toutes les occurrences.

Une version plus générale de votre script pourrait ressembler à ceci:

# Paramètres du script - modifier les valeurs selon vos besoins:
proprieté autoSave : faux -- enregistrer et fermer automatiquement le document?
proprieté replaceAll : faux -- remplacer toutes les occurrences de searchText?
proprieté searchText : "1234"
proprieté replaceText : "abcd"

on run -- exemple
   doStuff pour (choisir un fichier avec plusieurs sélections autorisées)
end run

faire des trucs pour someFiles -- traiter les éléments de fichier
   dire à l'application "BBEdit" de répéter avec aFile dans someFiles
      ouvrir aFile
      dire au document 1 de dire à son texte
         si replaceAll alors
            remplacer searchText en utilisant replaceText options {commencer par le haut:vrai}
         else -- remplacer la première correspondance
            définir findResult comme find searchText options {commencer par le haut:vrai} en sélectionnant la correspondance
            si found of findResult then set contents of selection to replaceText
         end if
      end tell
      si autoSave alors
         fermer le document 1 en sauvegardant
      sinon -- examiner avant de fermer, etc
         activer
      end if
   end repeat
fin doStuff

0 votes

Le script a fonctionné mieux que je ne l'aurais imaginé! Merci beaucoup pour votre aide! Le problème a été résolu d'une autre manière (avec l'aide de mon collègue) pour certaines raisons en cours de route. J'ai donc oublié de revenir et de suivre ce côté de la question.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X