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

标签 node.js xml xml-parsing filestream

我很难找到可以解析 1G+ 大小的大型 xml 文件的 Node 包。我们的后端服务器主要是 node.js,所以我不想用另一种语言/平台构建另一个服务来解析 xml 并将数据写入数据库。有没有人在 Node 中成功地做过这种事情?你用什么?我看过很多包,如 xml-stream、big-xml 等,它们都有自己的问题。有些甚至不能在 mac 上编译(而且看起来已经过时并且不再受支持)。我真的不需要将解析的结果转换成 js 对象或类似的东西。只需要理解数据,然后写入数据库。

最佳答案

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

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

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

这给您留下了几个选择:

Saxon 似乎与最近的 W3C 具有最高级别的一致性规范,所以如果模式验证等比这更重要,那可能是一个不错的选择。否则 Libxml 和 Expat 似乎都是 stack up pretty well performance wise并且已经预装在大多数操作系统上。

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())

当然我不知道你的数据库写入流是什么样子的,所以这里我只是把它写入一个文件。

关于node.js - 在 node.js 中解析大型 xml 文件(1G+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52314871/

相关文章:

node.js - 你能从 mongo 访问 mongoose 创建的数据库吗?

node.js - Express、Pug 和 Webpack

javascript - 在脚本中编写 ejs 给了我错误 'Expression expected'

node.js - Heroku 中发现应用程序错误

c# - 一个 xelement 和多个命名空间

java - 如何拥有一个可扩展的CardView?

xml - 如何用是/否表示决策树?

java - 当我需要 DocumentBuilder 时使用 SAX 解析器

ruby - 使用 Ruby 将 XML 转换为 JSON 并将其保存为单独的文件

java - 如何将本地 xml 文件转换为 org.ksoap2.serialization.SoapObject?