3

我正在组装一个脚本来自动生成不同版本的报告。该脚本将首先导入 XML 文件,然后运行一些其他函数来整理 Indesign 项目。

当我运行这个脚本时,

var myMenuAction = app.menuActions.item("Import XML...");
myMenuAction.invoke();

“导入 XML”对话框打开并要求我选择要导入的 XML 文件,单击“打开”后会弹出“XML 导入选项”框。到目前为止,一切都很好。但是在我单击“确定”后,“导入 XML”框再次弹出。

这不是一个真正严重的问题,如果我选择了我想要的文件和我第一次想要的选项,我是否再次选择它们或只是点击“取消”似乎没有什么区别,所以脚本仍然做我想做的事,只是看起来不是很整洁。

所以我的问题是我需要做什么才能获得一轮导入 XML 对话框?

4

1 回答 1

2

不管你是否称其为大师,我实际上也对此感到困惑。但是您自己的观察是正确的!

...是否有可能因为菜单中有两个“导入 XML ...”实例(一个在“文件”下,另一个在“结构”窗口的下拉菜单中)都被调用?

这确实是正确的。从集合xx.item(yy)中检索一个或多个项目。来自Marc Autret 的博客

最大的秘密是上述方法实际上都没有返回任何元素。. . 除了将“元素”理解为对象说明符。

您得到的是对“多个对象”的引用,是的,有两个名为“导入 XML...”的菜单。很难说服 InDesign表明有两个;myMenuAction.length不起作用(它“是”单个元素,因此它没有长度),并且再次myMenuAction.constructor.name显示[Object MenuAction]单个元素。但是,alert (myMenuAction.name);最终显示了(未)预期的输出:

显示两个菜单的警报框

遍历 DOM 花费了大量的时间来找出如何只调用一个. 我选择找到“文件”->“导入 XML...”,这就是它所需要的:

var myMenu = app.menus.item("Main");
var fileMenu = myMenu.menuElements.item("File");
alert (fileMenu.menuItems.everyItem().name);
var myXmlMenu = fileMenu.menuItems.item("Import XML...");
alert (myXmlMenu.name);
myMenuAction = myXmlMenu.associatedMenuAction;
alert (myMenuAction.name);
myMenuAction.invoke();

如果您想使用它,您可以忽略警报。请注意,这些字符串不是其可本地化的形式——此示例仅适用于英语的 InDesign,但在设置为使用另一种界面语言时无效。

更好的方法是尽可能避免调用菜单。在这种情况下,您可能可以安全地用以下代码替换您的代码:

folder = Folder.myDocuments;
if (File.fs == "Windows")
    myFile = folder.openDlg( 'Load XML', "XML files,*.xml;All files:*.*", false);
else
    myFile = folder.openDlg( 'Load XML', function(file)
        {
            return file instanceof Folder ||
            (!(file.hidden) && file.name.match(/\.(xml)$/i));
        }, false );
}
if (myFile)
    xml = app.activeDocument.importXml(myFile);

一些优点是它独立于语言环境。您可以自定义“打开”对话框以从另一个文件夹(例如,保存当前文档的文件夹)开始,并使用其他或更多文件过滤器;您可以将 XML 导入当前文档,或直接导入现有元素(导入 XML 对话框中“导入选定元素”的脚本版本);您将获得对新加载的 XML 对象的引用,因此您可以在导入后立即对其进行后处理。

于 2014-04-19T22:35:42.383 回答