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

标签 javascript xml regex parsing

我对 javascript 相当陌生,我正在尝试为基于 java 的应用程序开发脚本,并使用 javascript 作为其接口(interface)来内联处理/修改 XML 项目信息。不涉及浏览器。

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

目标是能够读取包含许多可选处理参数的模板项目 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>  

我可以在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);

第一个project.replace按预期工作,并将用“GammaRGB.plugin”替换“Gamma.plugin”。

然而,第二个正则表达式不执行任何操作,尽管外部 js 正则表达式求值器中的相同正则表达式能够解析并删除整个第二个 <PLUGIN> Overly.plugin </PLUGIN>部分。我习惯了构建perl正则表达式,所以这里的正则表达式是基于我已经了解到的js和多行解析的知识。

我希望能够在纯 JavaScript 中解析和删除 xml 部分,而无需加载单独的 XML 解析器。我总是知道将传入的 XML,因此首选 XML 的直接文本基础解析。

感谢您的帮助,

比尔

最佳答案

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

我可以建议使用(来自 JavaScript)基于 Java 的 DOM 解析器(例如 java.xml.parsers 中可用的)来操作 XML,而不是使用正则表达式吗?使用正则表达式进行高级 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);

(另请参阅 Parsing HTML The Cthulhu Way 。)

关于javascript - 在 javascript 中解析 XML - 没有浏览器 - 没有 XML 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4129855/

相关文章:

javascript - 如果我在用户受限页面上使用 Google Analytics(分析)会出现任何问题吗?

javascript - 为动态 div block 添加链接和图像

xml - 在 Dart 中读取 XML 文件

python - 正则表达式贪心问题

javascript - 如何更改 Jest 中模拟模块中函数的模拟实现

javascript - jQuery 加载数据到 jqGrid

java - JAXB:如何避免 xmlns:xsi 的重复命名空间定义

.net - XmlDocument缓存内存使用

c - 用于 Visual Studio C 的 POSIX 兼容正则表达式库

java - 使用 Java RegEx 全局替换分组匹配