我试图在我的节点项目中将 XML 文件解析为 JSON 文件。为了解析较小的文件,我一直使用“fast-xml-parser”。
我现在处理的文件要大得多,实际上大到超出了可用内存。由于这个问题,我必须使用支持管道的解析器。我在网上查看并找到了一个名为“sax”的,但据我所知,它不会解析为 JSON。
我尝试将“fast-xml-parser”放入“sax”提供的侦听器中,如下所示:
import fs from 'fs';
import sax from 'sax';
import { XMLParser, X2jOptionsOptional } from 'fast-xml-parser';
const parserOptions: X2jOptionsOptional = {
ignoreDeclaration: true,
ignoreAttributes: false,
removeNSPrefix: true,
attributeNamePrefix : "",
transformTagName: (tagname) => camelize(tagname),
transformAttributeName: (attributeName) => camelize(attributeName),
updateTag: (tagName, jPath, attrs) => {
if (tagName == 'placemark') return 'placemarks';
if (tagName == 'timeStep') return 'timesteps';
}
}
const parser = new XMLParser(parserOptions)
const saxStream = sax.createStream(false, {
trim: false,
lowercase: true,
xmlns: true,
position: false
})
saxStream.on('data', (data) => {
const parsed = parser.parse(data)
fs.writeFileSync('src/forecast/forecast.json', JSON.stringify(parsed))
})
当使用上面的监听器时,第一块数据被解析并放入json文件,之后,抛出一个错误:
Cannot read properties of undefined (reading 'addChild')
有人知道如何将数据块解析为一个 JSON 文件吗?
Node.js 不幸的是没有很好地提供 XML 工具。您可以使用 sax.js 解析器,但它涉及一些低级编程,它肯定不会处理到 JSON 的转换,您需要自己编程。
这个工作真的需要在node.js下运行吗?如果您能够在 Java 或 C# 下运行,您可以编写流式 XSLT 3.0 转换并使用 Saxon-EE [免责声明:我公司的产品] 运行它。在 node.js 下运行的 SaxonJS 产品不提供流式传输。
您可以考虑的另一种可能性是使用 sax.js 将大文件拆分为许多小的 XML 文件,然后使用非流式实用程序(例如 fast-xml-parser)处理这些文件。