我需要使用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
答案 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
程序为osx
,CONFORMED-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的项目页面上详细了解这些声明的含义。