导入数据后如何在After Effects中访问XML元素?

问题描述

我今天早些时候使用JSon发布了与此类似的内容,但是放弃了,我改用了XML。有人可以告诉我我在做什么错吗?我有一个XML文件,正在通过After Effects中的脚本进行解析,但不确定如何访问XML元素。

我的XML文件是:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <f>
        <accelX>0.4682</accelX>
        <accelY>-0.0352</accelY>
        <accelZ>-0.9247</accelZ>
        <gyroX>0.0555</gyroX>
        <gyroY>0.004</gyroY>
        <gyroZ>-0.0684</gyroZ>
    </f>
    <f>
        <accelX>-0.4682</accelX>
        <accelY>-0.0219</accelY>
        <accelZ>-0.9186</accelZ>
        <gyroX>0.0049</gyroX>
        <gyroY>0.0851</gyroY>
        <gyroZ>-0.046</gyroZ>
    </f>
</root>

我的jsx文件是这样的:

var file = new File;
var check = 0;

var mainWindow = new Window("palette","File Reader",undefined);
mainWindow.orientatizzaaq1on = "column";

var groupOne = mainWindow.add("group",undefined,"groupOne");
groupOne.orientation = "row";
var fileLocBox = groupOne.add("edittext","Selected File Location");
fileLocBox.size = [150,20];
var getFileButton = groupOne.add("button","File...");
getFileButton.helpTip = "Select a .json file to change the comp";

var groupTwo = mainWindow.add("group","groupTwo");
groupTwo.orientation = "row";
var applyButton = groupTwo.add("button","Apply");

mainWindow.center();
mainWindow.show();

getFileButton.onClick = function() {
    file = file.openDlg("Open a file","Acceptable Files:*.xml");
    fileLocBox.text = file.fsName;
    check = 1;
    }

applyButton.onClick = function() {
        if(check == 0) {
                alert("Please select a file");
                return false;
            } else {
                //app.beginUndoGroup("Comp Changes");
                var fileExtension = fileLocBox.text;
                var fileData;
                
                if(fileExtension.substring(fileExtension.length-4,fileExtension.length) == "json") {
                    fileData = readJson();
                    } else {
                        switch(fileExtension.substring(fileExtension.length-3,fileExtension.length)) {
                            case "txt":
                                //fileData = readTxt();
                            break;
                            case "xml":
                                fileData = readxml();
                            break;
                            }
                        }
                    changeComp(fileData);
                }
            alert("done");
   }

function readxml() {
    file.open("r");
    var xmlString = file.read();
    var myXml = new XML(xmlString);
    file.close();
    return myXml;
    }

function changeComp(data) {
    var nullz = app.project.activeItem.layers.addNull();
    nullz.threeDLayer = true;
    nullz.name = "parent to me";
    for (i = 0; i < 20; i++) {
       var temp = data.f[0].accelX;
       var t =i/25;
      nullz.xRotation.setValueAtTime(t,temp);
      }
  }

这条线在末端附近不起作用:

var temp = data.f[0].accelX;

我写错了吗? After Effects将创建一个值为“ 0”的关键帧,但不会完成for ...循环,也不会完成脚本。 我是否错误地访问了这些元素?

解决方法

我认为核心问题是data.f[0].accelX的值是字符串而不是数字(例如,"4.6"而不是4.6),所以setValueAtTime最终以非数字值结尾,该值不起作用 1

解决方案是在其上使用parseFloat

var temp = parseFloat(data.f[0].accelX);

有了这个,再加上laayers中的错字,我就能使它起作用。我认为。我不知道该怎么做,但是最后我得到了一个新的null层,该层在x上有20个旋转关键帧,感觉像是进步。

我认为育儿和命名方面可能仍然存在一些问题,但是我认为以上内容会让您陷入困境,并遇到下一个问题。

干杯。


1 我认为它可能会使脚本崩溃并在某处发出错误消息,但我真的不记得AE脚本的工作原理,并且(显然)我没有安装ESTK,所以我可以打开脚本编辑器。