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

时间:2018-05-21 14:14:13

标签: node.js xml xml2js

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

1 个答案:

答案 0 :(得分:1)

您的数据看起来像SGML,它是XML的超集,允许标记推断/遗漏。我正在为JavaScript发布一个SGML解析器(对于浏览器,node.js和其他CommonJS平台),但它还没有发布。目前,我建议使用古老的OpenSP软件,该软件没有npm集成软件包,但您可以轻松安装,例如。 Ubuntu / Debian使用 !function (e) { e.fn.easyPaginate = function (n) { function a() { clearTimeout(l), s = (f - 1) * d, i = s + d, e(h).each(function (a) { var t = e(this); t.hide(), a >= s && i > a && setTimeout(function () { t.fadeIn('fast') }, (a - Math.floor(a / d) * d) * n.delay), n.nextprev && (i >= u ? c.addClass('grey') : c.removeClass('grey'), s >= 1 ? r.removeClass('grey') : r.addClass('grey')) }), e('li', '#' + n.controls).removeClass(n.current), e('li[data-index="' + f + '"]', '#' + n.controls).addClass(n.current), n.auto && (n.clickstop && v || (l = setTimeout(t, n.pause))) } function t() { u >= i && (f++, a()) } var s, i, o, c, r, l, p = { step: 4, delay: 100, numeric: !0, nextprev: !0, auto: !1, pause: 4000, clickstop: !0, controls: 'pagination', current: 'current' }, n = e.extend(p, n), d = n.step, h = e(this).children(), u = h.length, f = 1, v = !1; this.each(function () { if (o = this, u > d) { var t = Math.floor(u / d); u / d > t && t++; var s = e('<div class="' + n.controls + '"></div>').appendTo(e(o).closest('.tab-pane')); if (n.nextprev && (r = e('<span class="glyphicon glyphicon-chevron-left"></span>').hide().appendTo(s).click(function () { e(this).hasClass('grey') || (v = !0, f--, a()) })), n.numeric) for (var i = 1; t >= i; i++) e('<li data-index="' + i + '">' + i + '</li>').appendTo(s).click(function () { v = !0, f = e(this).attr('data-index'), a() }); n.nextprev && (c = e('<span class="glyphicon glyphicon-chevron-right"></span>').hide().appendTo(s).click(function () { e(this).hasClass('grey') || (v = !0, f++, a()) })), a() } }) } }(jQuery); ,类似于其他Linuxen和Mac OS上的MacPorts。

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

必须告诉SGML和osx程序为osxCONFORMED-NAME添加省略的结束元素标记,并使用省略的end-element标记添加其他元素。您可以通过在SGML内容之前添加文档类型声明(DTD)来实现。在您的情况下,您提供给CIK程序的内容应如下所示:

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)作为标记省略指示符< / em>,告诉SGML这些元素的end-element标签可以省略,并由- O程序自动插入。

您可以在http://sgmljs.net/docs/sgmlrefman.html的项目页面上详细了解这些声明的含义。