我对 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*<PLUGIN\s+.*Overlay.*[\s\S]*?\/PLUGIN>/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/