我正在组装一个脚本来自动生成不同版本的报告。该脚本将首先导入XML文件,然后运行一些其他功能来整理Indesign项目。
当我运行此脚本时,
var myMenuAction = app.menuActions.item("Import XML...");
myMenuAction.invoke();
打开“导入XML”对话框并要求我选择要导入的XML文件,单击“打开”后,弹出“XML导入选项”框。到现在为止还挺好。但是在我单击“确定”后,再次弹出“导入XML”框。
这不是一个非常关键的问题,如果我选择了我想要的文件以及我想要的第一次选项,那么我是否再次选择它们或者只是点击“取消”似乎没有区别,所以脚本仍然按照我的意愿行事,它似乎并不是很整洁。
所以我的问题是我需要做什么才能获得一轮导入XML对话框?
答案 0 :(得分:2)
是不是宣布了Guru,我实际上也被这个愚弄了。但你自己的观察是正确的!
...是否有可能因为有两个实例"导入XML ..."在菜单中(一个位于File下,另一个位于Structure窗口的下拉菜单中)是否正在调用它们?
这确实是正确的。 xx.item(yy)
从集合中检索一个或更多项。来自Marc Autret's blog:
最大的秘密在于,上述方法都没有实际返回任何元素。 。 。除了理解一个'元素'作为对象说明符。
你得到的是对多个对象的引用,是的,有两个菜单叫做"导入XML ..."。很难说服InDesign show 有两个; myMenuAction.length
不起作用("是#34;单个元素,因此它没有长度),myMenuAction.constructor.name
显示[Object MenuAction]
- 再次,对于单个元素。但是,alert (myMenuAction.name);
最终显示(未)预期输出:
花了大量的遍历DOM来了解如何调用只是一个。我选择了#34; File" - > "导入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对象的引用,因此您可以在导入后立即对其进行后处理。