在node.js中解析大型xml文件(1G +)

u84*_*six 6 xml filestream node.js xml-parsing

我很难找到一个可以解析大小超过1G的大型xml文件的节点程序包。我们的后端服务器主要是node.js,所以我不想不得不用另一种语言/平台来构建另一个服务,只是为了解析xml并将数据写入数据库。有没有人在节点上成功完成这种事情?你用了什么?我看了一堆像xml-stream,big-xml等的程序包,它们都有自己的问题。有些甚至无法在Mac上编译(而且似乎已过时,不再受支持)。我真的不需要将解析的结果转换为js对象或类似的对象。只需了解数据,然后将其写入数据库即可。

uni*_*rio 11

最明显但不是很有帮助的答案是,这取决于要求。

但是,在您的情况下,这似乎很简单;您需要加载大量数据,这些数据可能适合也可能不适合内存,以便在将其写入数据库之前进行简单处理。我认为这就是为什么您希望将 CPU 工作作为单独的进程具体化的充分理由。因此,首先关注哪个 XML 解析器为您完成这项工作可能更有意义,而不是您想为其使用哪个 Node 包装器。

显然,任何需要在处理之前将整个文档加载到内存中的解析器都不是一个有效的选择。您将需要为此使用流以及支持这种顺序处理的解析器。

这让您有几个选择:

Saxon 似乎对最近的W3C规范具有最高级别的一致性,因此如果模式验证等很重要,那么它可能是一个不错的候选者。否则 Libxml 和 Expat 似乎在性能方面表现得很好,并且已经预装在大多数操作系统上。

可用于所有这些的 Node 包装器:

我的 Node 实现看起来像这样:

import * as XmlStream from 'xml-stream'
import { request } from 'http'
import { createWriteStream } from 'fs'

const xmlFileReadStream = request('http://external.path/to/xml')
const xmlFileWriteStream = new XmlStream(xmlFileReadStream)
const databaseWriteStream = createWriteStream('/path/to/file.csv')

xmlFileWriteStream.on('endElement: Person', ({ name, phone, age }) =>
  databaseWriteStream.write(`"${name}","${phone}","${age}"\n`))

xmlFileWriteStream.on('end', () => databaseWriteStream.end())
Run Code Online (Sandbox Code Playgroud)

当然,我不知道您的数据库写入流会是什么样子,所以这里我只是将其写入文件。