【问题标题】:Parse XML in javascript - no browser - no XML parser在 javascript 中解析 XML - 没有浏览器 - 没有 XML 解析器
【发布时间】:2011-05-07 00:04:28
【问题描述】:

我对 javascript 相当陌生,我正在尝试为基于 java 的应用程序开发脚本,并使用 javascript 作为其接口来处理/修改内联的 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 正则表达式评估器中的相同正则表达式能够解析和删除整个第二个 &lt;PLUGIN&gt; Overly.plugin &lt;/PLUGIN&gt; 部分。我习惯于构建perl正则表达式,所以这里的正则表达式是基于我对js和多行解析的了解。

我希望我可以在纯 javascript 中解析和删除 xml 部分,而无需加载单独的 XML 解析器。我总是知道要传入的 XML,所以首选 XML 的直接文本基解析。

感谢您的帮助,

比尔

【问题讨论】:

  • 在 3...2 中不要使用正则表达式...

标签: javascript xml regex parsing


【解决方案1】:

使用 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。)

【讨论】:

  • 谢谢。我也会看看这个方法。顺便说一句,我已经能够解析我打算使用转义 xml 的方式,但是在取消转义和写入新文件时数据被截断了一些奇怪的问题。
  • 既然 rhino 启用了 E4X,是否可以改为读取 XML 文件并将其转换为 javascript XML 字符串,然后可以使用以下命令直接访问:
  • 我可以在 rhino 中使用新的 XML 方法,并在 javascript 中声明 xml。或者是否有另一种在 rhino 中读取 XML 的方法,可以将数据保留为原生 js 字符串?也尝试了 String() 方法转换,但这似乎不起作用。我在基于文件的 xml 上不断收到的错误是“js:未捕获的 JavaScript 运行时异常:TypeError:不允许匹配“[xX][mM][lL]”的处理指令目标。”
【解决方案2】:

第二个正则表达式可能不起作用,因为您使用的是&amp;lt; 而不是&lt;&amp;gt; 而不是&gt;。 XML 在被正则表达式处理之前是否被转义?

还有[\s\S] 表示匹配空白或非空白,这实际上与. 相同。 (除非那是为了补偿 . 不匹配的换行符。)

【讨论】:

  • 我最初使用的是 但它在一些外部正则表达式评估器中不起作用,所以我切换到 <和>因为他们似乎更喜欢那样。在你提到它之前,我不知道 escape() 。我会试试看的。
  • 是的,[\s\S] 用于匹配换行符以及所有字符。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2022-11-21
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多