如何在extendscript中将新元素添加到现有XML文件中?

时间:2015-07-22 10:44:35

标签: javascript xml extendscript

我正在编写一个脚本,使用After Effects和Extendscript将一些xml数据更新为现有文件。我试图将新元素添加到现有文件中。我有这样的代码:

 function writeXml (xml) 
 { 
     var file = new File(filePath);
     if (!(xml instanceof XML)) 
     { 
        throw "Bad XML parameter"; 
     } 
     file.encoding = "UTF8"; 
     file.open("e");  
     file.write("\uFEFF"); 
     file.lineFeed = "windows"; 
     file.write(xml.toXMLString()); 
     file.close();
 }

但是这段代码用新元素替换了文档中的所有文本,因此我尝试使用xml注释,例如'标记'插入它下面的元素。 Heres是xml:

<Root>
<child name="ChildOne"/>
<child name="ChildTwo"/>
<!---->
</Root>

代码:

function writeXml (xml) 
{ 
     var file = new File(filePath);
     var fileOk = file.open("e"); 
     var strLine, line, docPos;

     if (!(xml instanceof XML)) 
     { 
        throw "Bad XML parameter"; 
     } 

     if (!fileOk)
     {
         throw "Cant open file";
     }

     file.encoding = "UTF8"; 

     while (!file.eof)
     {
         strLine = file.readln();
         docPos= strLine.search("<!---->");
         if (docPos!= -1)
         {
             file.seek(0, 1);
             file.writeln("<!----> \n");
             break;
         }  
     }
     file.close(); 
}

此代码将elmemnt写入正确的位置,但它会删除下一行中的某些字符,如下所示:

<Root>
<child name="ChildOne" />
<child name="ChildTwo" />
<!---->
<child name="ChildThree">
ot> 

我的问题是:为什么会这样?有没有正确的方法来实现这一目标? 感谢。

2 个答案:

答案 0 :(得分:2)

  

为什么会这样?

您正尝试在seekwriteln的现有文件中插入一行。不幸的是,这根本不是文件如何工作。你不能插入一个字节 - 更不用说整行了。

  

有没有正确的方法来实现这个目标?

是的,有各种各样的方式。

例如:打开此文件进行读取,打开一个新文件进行写入。从此文件中读取每行并将其写入新文件。如果您遇到标记,请插入新行。完成后,删除旧文件并重命名新文件。

答案 1 :(得分:0)

我找到了一个解决方案,它看起来很丑陋,但确实有效:

function writeXml (xml) 
{ 
     var file = new File(filePath);
     var fileOk = file.open("e"); 
     var strLine, line, docPos, marker;
     marker = "<!---->";

     if (!(xml instanceof XML)) 
     { 
        throw "Bad XML parameter"; 
     } 

     if (!fileOk)
     {
         throw "Cant open file";
     }


     while (!file.eof)
     {
         strLine = file.readln();
         docPos= strLine.search(marker);
         if (docPos!= -1)
         {
             file.seek( (-marker.length - 2), 1);
             file.writeln(xml + "\n" + marker + "\n</Root>");
             break;
         }  
     }
 file.close(); 
}