AS3中URLLoader加载XML后修改内容无法写入文件问题咨询
问题原因
你的问题和加载器占用文件无关,URLLoader完成加载操作后就会自动释放本地文件的句柄,写入失败的核心原因是MMExecute执行的JSFL代码存在语法错误:FLfile.write的入参要求两个被引号包裹的字符串值,你直接拼接路径变量和XML内容时没有添加引号,也没有处理XML内容里的双引号、换行等特殊字符,导致JSFL代码执行时直接报错,写入操作根本没有生效。
解决方案
按以下要求修正代码即可:
- 先将修改后的XML对象转为字符串,提前转义内容里的特殊字符避免破坏JSFL语法
- 给
FLfile.write的两个参数都添加引号包裹,避免语法冲突 - 可添加返回值校验,确认写入操作是否成功
修正后代码
var buttonListXML:XML = new XML(); var MenuXMLLoader:URLLoader = new URLLoader(); function loadXML(){ MenuXMLLoader.load(new URLRequest(pathXML_RELATIVE)); MenuXMLLoader.addEventListener(Event.COMPLETE, addNodeToXML); } function addNodeToXML(e:Event){ buttonListXML = new XML(e.target.data); // 修改节点值 buttonListXML.button[2].@number = 555; // 清理加载器 MenuXMLLoader.removeEventListener(Event.COMPLETE, addNodeToXML); MenuXMLLoader = null; trace(buttonListXML); // 核心修正:处理XML字符串转义 + 正确拼接JSFL参数 var xmlStr:String = buttonListXML.toXMLString(); // 转义XML内容里的单引号,避免和外层JSFL的单引号冲突 xmlStr = xmlStr.replace(/'/g, "\\'"); // 拼接正确的JSFL代码,两个参数都用单引号包裹 var jsflCmd:String = "var writeRes = FLfile.write('" + pathXML_ABSOLUTE + "', '" + xmlStr + "');"; // 可选:添加返回值打印,在Animate的输出面板确认写入结果 jsflCmd += "fl.trace('写入结果:' + writeRes);"; MMExecute(jsflCmd); }
额外注意事项
- 确认
pathXML_ABSOLUTE是符合JSFL要求的绝对路径,Windows平台路径的反斜杠要转义为双反斜杠,或者直接用正斜杠 - 确认目标XML文件没有被其他程序(比如记事本、代码编辑器等)以独占方式打开
- 确认Animate有目标目录的写入权限,不要写入系统级的受保护目录
内容的提问来源于stack exchange,提问作者Mat Gap
相关产品推荐
相关产品推荐

