1

我需要使用 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 实现:Parsing XML with no closing tags in Java

4

1 回答 1

2

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

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

SGML 和osx程序必须被告知为CONFORMED-NAME,CIK和其他带有省略的结束元素标签的元素添加省略的结束元素标记。为此,您可以在 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)>
  <!ELEMENT
     (CONFORMED-NAME,CIK,ASSIGNED-SIC,IRS-NUMBER,
       STATE-OF-INCORPORATION,FISCAL-YEAR-END,
       STREET1,CITY,STATE,ZIP) - O (#PCDATA)>
]>
<ISSUER> ... rest of your input data followin here

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

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

于 2018-05-21T23:15:51.863 回答