You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}`);
  }
}

关键要点说明

  1. 元素获取方式:InDesign的XML元素必须用elements("节点名")获取集合,再用item(index)访问具体元素,不能直接用点语法(比如myxml.project是无效的)。
  2. 集合长度:XML元素集合的长度是用length()方法,不是常规的length属性。
  3. 属性获取:要获取元素的属性值,得用attributes.item("属性名").value,直接toString()不会返回你想要的属性内容。
  4. 小提醒:你的XML里style标签的属性是nome,如果是拼写错误(应该是name),记得同步修改代码里的属性名。

内容的提问来源于stack exchange,提问作者Chiccorosso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:37:34