在 Javascript 中添加缺少的 XML 结束标记



我需要使用 Node.js 解析具有以下结构的外部文件。

<ISSUER>
<COMPANY-DATA>
<CONFORMED-NAME>EXACTECH INC
<CIK>000012345
<ASSIGNED-SIC>9999
<IRS-NUMBER>8979898988
<STATE-OF-INCORPORATION>FL
<FISCAL-YEAR-END>1231
</COMPANY-DATA>
<BUSINESS-ADDRESS>
<STREET1>22W 56TH COURT
<CITY>GAINSVILLE
<STATE>FL
<ZIP>32653
<PHONE>999-999-9999
</BUSINESS-ADDRESS>
<MAIL-ADDRESS>
<STREET1>22W 56TH COURT
<CITY>GAINSVILLE
<STATE>FL
<ZIP>32653
</MAIL-ADDRESS>
</ISSUER>

块具有结束标记,但个别行没有。如何添加缺少的结束标记,以便可以解析 XML?

我无法控制XML文件的生成,因此无法在源头修复它。

这类似于这个 Java 实现:P在 Java 中不带结束标记的 XML

您的数据看起来像SGML,这是允许标记推断/省略的XML超集。我正在发布一个用于JavaScript的SGML解析器(用于浏览器,节点和其他CommonJS平台.js但它尚未发布。目前,我建议使用古老的OpenSP软件,该软件没有npm集成包,但您可以轻松安装。Ubuntu/Debian 使用sudo apt-get install opensp,在其他 Linuxen 和 Mac OS 上通过 MacPort 类似。

OpenSP 软件包包含用于将 SGML 向下转换为 XML 的osx命令行实用程序。您可以使用节点child_process核心包来调用osx程序,通过管道传输 SGML 数据,并获取它生成的 XML 输出,然后将生成的 XML 馈送到节点应用程序中您选择的 XML 解析器。

必须告诉SGML和osx程序为CONFORMED-NAMECIK添加省略的结束元素标签,以及使用省略的结束元素标签添加其他元素标签。为此,您可以在 SGML 内容之前预置文档类型声明(DTD(。在您的情况下,您提供给osx程序的内容应如下所示:

<!DOCTYPE ISSUER [
<!ELEMENT ISSUER - -
(COMPANY-DATA,BUSINESS-ADDRESS,MAIL-ADDRESS)>
<!ELEMENT COMPANY-DATA - -
(CONFORMED-NAME,CIK,ASSIGNED-SIC,IRS-NUMBER,
STATE-OF-INCORPORATION,FISCAL-YEAR-END)>
<!ELEMENT (BUSINESS-ADDRESS,MAIL-ADDRESS) - -
(STREET1,CITY,STATE,ZIP,PHONE?)>
<!ELEMENT
(CONFORMED-NAME,CIK,ASSIGNED-SIC,IRS-NUMBER,
STATE-OF-INCORPORATION,FISCAL-YEAR-END,
STREET1,CITY,STATE,ZIP,PHONE) - O (#PCDATA)>
]>
<ISSUER> ... rest of your input data followin here

至关重要的是,CONFORMED-NAMECIK和其他类似字段的元素的声明使用- O(连字符减号和字母O(作为标签省略指示器,告诉SGML这些元素的结束元素标签可以省略,并且将由osx程序自动插入。

您可以在我的项目页面上阅读有关这些声明含义的更多信息 https://sgmljs.net/docs/sgmlrefman.html .

更新:随着上面提到的 Node SGML 包.js已经发布了很多年,并且@yumba表达了对它的兴趣,我稍微更新了 DOCTYPE 声明并为PHONE元素添加了声明。我还验证了该示例是否按预期解析。请注意,强烈建议使用官方的 DOCTYPE 声明作为您的数据格式(如果有的话(,而不是我根据给定的(必然非常有限(示例数据创建的声明。

无论如何,要在 Node.js 上进行解析,请安装 Node.js 和 Node.jssgml包,例如调用

npm install -g sgml

然后

sgmlproc test.sgm

在命令行上,其中test.sgm包含上述 SGML 文本。 默认情况下,sgmlproc将在标准输出上输出 XML,因此实际上没有必要提供任何命令行选项,但您可能需要检查 sgmlproc 命令行参考以查看可用的内容。

最新更新