【问题标题】:Adding missing XML closing tags in Javascript在 Javascript 中添加缺少的 XML 结束标记
【发布时间】:2018-10-31 05:24:12
【问题描述】:

我需要使用 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

【问题讨论】:

    标签: node.js xml xml2js


    【解决方案1】:

    您的数据看起来像 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-NAME、CIK 和其他类似字段的元素的声明使用 - O(连字符减号和字母 O)作为 标记省略指示符,告诉 SGML这些元素的结束元素标签可以省略,并由osx 程序自动插入。

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

    【讨论】:

    • 是的,它是一个 SGML 文件。但是,我正在寻找原生 Node.js 解决方案,因为我们的系统是基于 Windows 的。是否可以为 Windows 编译 OpenSP?您是如何创建 SGML 解析器的?是纯 JS 还是你用的是 OpenSP 代码?
    • 好像还有windows版本的。
    • 正要发布指向 jclark.com/sp/index.htm 的链接,这是原始项目主页,它有一个非常旧的 Win32 版本可供下载(我相信它应该可以正常工作,因为 SP 已经广泛被视为参考SGML软件)。我记得 Norman Walsh(他在标记社区中的人脉非常好)如果几个月前最近的构建没有成功,他会发推文。关于 sgmljs.net,它是 100% 从头开始​​编写的 JavaScript,无需使用 emscripten 或类似的工具转换旧的 SP 代码,并且零依赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多