在javascript中解析XML - 没有浏览器 - 没有XML解析器

bil*_*ggy 0 javascript regex xml parsing

我是javascript的新手,我正在尝试为基于Java的应用程序开发脚本,并使用javascript作为其内联处理/修改XML项目信息的接口.没有涉及浏览器.

我在shell中使用rhino来模仿应用程序环境,以便测试和构建解析和修改XML所需的javascripts.

目标是能够读入模板项目XML,其中包含许多可选的处理参数,如果不需要处理函数,则删除整个XML部分.另外,我需要修改XML中的特定值,我可以这样做,如下所示.

这是一个精简的XML项目文件(sample_proj.xml):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  
<PROFILE lastSavedByAppVersion="" type="project" version="1">  
 <OPTIONS processingmode="concurrent"/>
 <ENCODESESSION name="My_session">  
  <OPTIONS framesizemode="custom"/>  
  <PLUGINGROUP>  
   <PLUGIN duration="0" endOffset="0" name="Gamma.plugin" repeats="1" startOffset="0">  
    <PARAMGROUP event_id="0" keyframe="0">  
     <PARAM>  
      <NAME>Cb</NAME>  
      <VALUE>1.0</VALUE>  
     </PARAM>  
     <PARAM>  
      <NAME>Cr</NAME>  
      <VALUE>1.0</VALUE>  
     </PARAM>  
     <PARAM>  
      <NAME>Y</NAME>  
      <VALUE>1.0</VALUE>  
     </PARAM>  
    </PARAMGROUP>  
   </PLUGIN>  
   <PLUGIN duration="300" endOffset="0" name="Overlay.plugin" repeats="1" startOffset="0">  
    <PARAMGROUP event_id="0" keyframe="0">  
     <PARAM>  
      <NAME>Filename</NAME>  
      <VALUE></VALUE>  
     </PARAM>  
    </PARAMGROUP>  
   </PLUGIN>  
  </PLUGINGROUP>  
 </ENCODESESSION>  
 <EVENTTIMELINE dropframe="1" fps="24">  
  <EVENT id="0">  
   <FRAME>0</FRAME>  
   <DURATION>0</DURATION>  
  </EVENT>  
 </EVENTTIMELINE>  
  <SOURCE batchtype="cliplist" type="filesource">  
  <MEDIA name="File" type="video">  
   <FILENAME/>  
  </MEDIA>  
  <MEDIA name="File" type="audio">  
   <FILENAME/>  
  </MEDIA>  
  <clipListModel audioChannelMask="-1" audioFormat="AUTO" singleOutput="false" videoFormat="AUTO">  
   <clipList/>  
  </clipListModel> 
  <TIMECODECONFIGURATION>  
   <MODE>none</MODE>  
  </TIMECODECONFIGURATION>  
 </SOURCE>   
</PROFILE>  
Run Code Online (Sandbox Code Playgroud)

我可以在rhino shell中使用以下js代码来读取文件,然后尝试解析:

importPackage(java.io)

var project = readFile("sample_proj.xml");

project = project.replace(/Gamma/g, "GammaRGB");
project = project.replace(/\s*&lt;PLUGIN\s+.*Overlay.*[\s\S]*?\/PLUGIN&gt;/img, "");
print(project);
Run Code Online (Sandbox Code Playgroud)

第一个project.replace按预期工作,将"Gamma.plugin"替换为"GammaRGB.plugin".

然而,第二个正则表达式没有做任何事情,尽管外部js正则表达式评估器中的相同正则表达式能够解析并删除整个第二<PLUGIN> Overly.plugin </PLUGIN>部分.我习惯于构建perl正则表达式,所以这里的正则表达式是基于我能够学习的关于js和多行解析的东西.

我希望我可以解析并删除纯JavaScript中的xml部分,而无需加载单独的XML解析器.我总是知道将传入的XML,因此首选XML的直接文本库解析.

谢谢你的帮助,

法案

Mik*_*ark 6

使用Rhino,您可以调用Java代码.(您可能已经知道这一点,因为您的代码显然正在使用java.io包来从文件中读取文本.)

我是否可以建议使用(来自JavaScript)基于Java的DOM解析器(例如java.xml.parsers中提供的)来操作XML,而不是使用Regex?使用正则表达式进行高级XML/HTML操作很难正确执行,特别是如果您的软件需要在以后接受新的未知输入时.

这里有一些Java代码可能会让你开始使用一些等效的JavaScript:

import java.xml.parsers.*;

java.io.File file = new java.io.File("c:\\sample.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document doc = db.parse(file);
Run Code Online (Sandbox Code Playgroud)

(另请参阅解析HTML The Cthulhu Way.)