使用 JavaScript 语法在 AppleScript 中打开 XML 文件

Posted

技术标签:

【中文标题】使用 JavaScript 语法在 AppleScript 中打开 XML 文件【英文标题】:Open XML file in AppleScript with JavaScript syntax 【发布时间】:2021-11-07 01:22:19 【问题描述】:

我正在编写我的第一个更大的 AppleScript,并且由于我通常开发 TypeScript,我决定使用 AppleScript 的 javascript 版本。我需要读取并解析一个 XML 文件。

Apple 在他们的文档中有一个示例,但是文档中只有 AppleScript 语法的示例,而不是 JavaScript 语法的示例:

https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/WorkwithXML.html#//apple_ref/doc/uid/TP40016239-CH67-SW1

我如何在 JavaScript 中实际执行给定的示例?

我可以将文件作为字符串读取,但这对我没有帮助,因为我需要遍历 XML 树。

【问题讨论】:

Apple 的自动化 JavaScript 已瘫痪并被废弃。获取 Node.js。 我实际上在使用 node.js 处理大多数东西,甚至在 typescript 中开发了这个项目,该项目捆绑并编译为 applescript。但是我不知道如何使用非 applescipt 编程语言更新苹果音乐的播放列表或曲目评分。 是的,Apple 确实在支持非 AppleScript 语言方面搞砸了:Scripting Bridge 是垃圾,而 JXA 也好不了多少。 (Mac 自动化团队最终在 2016 年解散/解雇,原因很明显。)有 Python/Ruby appscript、SwiftAutomation 和 nodeautomation,我编写了但不再支持。由于 nodobjc 中的 bitrot,Node 桥无法运行;如果你能解决这个问题,那么你可以使用它,但通常我建议通过 ASOC 向 osascript/调用 AS 处理程序作为最不可怕的解决方案。 我正在传输大量信息(您可以在下面看到完整的脚本)并考虑从 osascript 获取信息,然后使用它,然后将其放回 osascript。那将是大约 1.000.000 次对 osascript 的调用。 (检查存在哪些播放列表,更新内容并更新所有歌曲的 BPM、音调等) 虽然可以对多个对象执行命令以提高效率(例如get name of every track…get album of every track…),但如果您要设置很多属性,那么,是的,您必须发送单独的命令每一个人。如果您所做的只是获取和设置简单值,TypeScript->JXA 可能是您的最佳选择。 JXA 在一定程度上发挥了作用:它是更复杂的操作,例如 moveduplicate 以及易于破坏的记录和枚举类型。 (整个 AppleScript 堆栈在 2016 年之后进入维护模式,所以如果你确实遇到了这些缺陷之一,你就是 SOOL。) 【参考方案1】:

最后我使用了 webpack 和一个 npm-package 来将 XML 文件解析为 JSON:https://www.npmjs.com/package/fast-xml-parser

我的代码示例在这里:

https://github.com/kellertobias/rekordbox-to-music-playlists/blob/master/src/load-rekordbox.ts

【讨论】:

以上是关于使用 JavaScript 语法在 AppleScript 中打开 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在 Rails 视图中使用 javascript 函数的正确语法

javascript 语法错误,缺少“;”

使用带有 javascript 导入语法的括号

使用带有 javascript 导入语法的括号

使用 JavaScript 语法在 AppleScript 中打开 XML 文件

使用 MVC Razor 语法检查视图模型属性在 Javascript 中是不是具有值