当前位置 : 主页 > 网页制作 > Nodejs >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
我很难找到一个可以解析大小为1G的大型xml文件的节点包.我们的后端服务器主要是node.js,所以我不得不在另一种语言/平台上构建另一个服务,只是为了解析xml并将数据写入数据库.在节点
我很难找到一个可以解析大小为1G的大型xml文件的节点包.我们的后端服务器主要是node.js,所以我不得不在另一种语言/平台上构建另一个服务,只是为了解析xml并将数据写入数据库.在节点中有没有人成功做过这种事情?你用了什么?我看过像xml-stream,big-xml等一堆软件包,它们都有自己的问题.有些甚至无法在mac上编译(并且看起来过时且不再受支持).我真的不需要将解析后的结果转换为js对象或类似的东西.只需要理解数据然后写入数据库. 最明显但不是非常有用的答案是它取决于要求.

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

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

这为您提供了一些选择:

> Libxml
> Expat
> Saxon

Saxon似乎与最近的W3C规范具有最高级别的一致性,因此如果模式验证等重要,那么可能是一个很好的候选者.否则,Libxml和Expat似乎都在stack up pretty well performance wise,并且已经预装在大多数操作系统上.

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

> libxmljs – Libxml
> xml-stream – 外籍人士
> node-expat – 外籍人士
> saxon-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())

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

网友评论