InDesign ExtendScript遍历XML style节点失败问题求助
解决InDesign脚本遍历XML style节点的问题
我正在通过InDesign脚本读取XML并创建文本框,给定的XML内容如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <project name="IPS300980XX_NEW" pagecount="50"> <styles> <style nome="xxx" font="Arial" fontsize="10" bold="2" center="2" /> <style nome="yyy" font="Times" fontsize="24" bold="1" center="1" /> <style nome="zzzz" font="Helvetica" fontsize="22" bold="2" center="1" /> </styles> </project> </root>
我尝试遍历其中的"style"节点,但始终未能成功。我使用的代码如下(我尝试过xmlelements、children、items等多种组合,但都没有效果):
"myxml"是已打开的XML文档,除"getTheStyle"(以及对应的"test")外,所有变量都有预期值。
function creastili(){ var styles = myxml.project.styles; var list = styles.child("style"); var getTheStyle = ""; for(var i = 0; i < list.length(); i++){ getTheStyle = list[i]; test = getTheStyle.toString(); //getTheStyle is always empty. } }
问题分析与解决方案
你遇到的核心问题是InDesign的XML对象模型和常规浏览器DOM不一样,不能直接用点语法(比如myxml.project)或者简单的child()方法来获取节点,得用Adobe专门的XML操作方法。
下面是修正后的代码,我会一步步解释:
function creastili(){ // 先确认myxml是有效的XML文档对象 if(!myxml || !myxml.isValid) { alert("XML文档无效!"); return; } // 获取root下的第一个project元素(elements()返回集合,用item(0)取第一个) var project = myxml.elements("project").item(0); // 获取project下的第一个styles元素 var styles = project.elements("styles").item(0); // 获取styles下所有的style元素集合 var styleList = styles.elements("style"); var getTheStyle; // 遍历集合时,要用length()方法,不是length属性 for(var i = 0; i < styleList.length(); i++){ // 用item(i)获取第i个style元素,不能直接用[i] getTheStyle = styleList.item(i); // 如果你想获取style的属性,比如nome、font这些,要这么写: var styleName = getTheStyle.attributes.item("nome").value; var font = getTheStyle.attributes.item("font").value; var fontSize = getTheStyle.attributes.item("fontsize").value; // 测试输出,你可以用alert或者InDesign的控制台查看 alert(`Style: ${styleName} | Font: ${font} | Size: ${fontSize}`); // 或者写入控制台 console.log(`Style ${i+1}: ${styleName}`); } }
关键要点说明
- 元素获取方式:InDesign的XML元素必须用
elements("节点名")获取集合,再用item(index)访问具体元素,不能直接用点语法(比如myxml.project是无效的)。 - 集合长度:XML元素集合的长度是用
length()方法,不是常规的length属性。 - 属性获取:要获取元素的属性值,得用
attributes.item("属性名").value,直接toString()不会返回你想要的属性内容。 - 小提醒:你的XML里style标签的属性是
nome,如果是拼写错误(应该是name),记得同步修改代码里的属性名。
内容的提问来源于stack exchange,提问作者Chiccorosso
相关产品推荐
相关产品推荐

