我正在开发一个 Node.js 应用程序,用于处理文件中的大量地理空间数据并将其加载到 JSON 文档数据库中。
源数据采用大型(最多 10 GB)XML 文档的形式。我用过sax.js解析源文档,这为我提供了代表 XML 结构的 JavaScript 对象:
{ name: 'gml:featureMember',
attributes: {},
isSelfClosing: false,
parent: null,
children:
[ '\r\n ',
{ name: 'AX_BesondereFlurstuecksgrenze',
attributes: { 'gml:id': 'DEHHALKAn0007s8z' },
isSelfClosing: false,
children:
[ '\r\n ',
{ name: 'gml:identifier',
attributes: { codeSpace: 'http://...' },
isSelfClosing: false,
children: [ 'urn:adv:oid:...' ] },
'\r\n ',
{ name: 'lebenszeitintervall',
attributes: {},
isSelfClosing: false,
children:
[ '\r\n ',
{ name: 'AA_Lebenszeitintervall',
attributes: {},
isSelfClosing: false,
children:
[ '\r\n ',
{ name: 'beginnt',
attributes: {},
isSelfClosing: false,
children: [ '2010-03-07T08:32:05Z' ] },
'\r\n ' ] },
'\r\n ' ] },
...
但是,sax.js 显然无法访问当前片段。所以我正在寻找一种从 sax.js 或不同的流解析器获取 XML 片段的方法。由于我在 Windows 上,我只想使用不需要编译的模块。
最佳答案
根据@Jagrut的建议,我搜索了一个node.js的XPath实现,它可以与sax.js一起使用,并且不需要DOM或 native 库。我发现saxpath这符合要求。
使用方法如下:
var fs = require('fs');
var saxParser = require('sax').createStream(true);
var saxPath = require('saxpath');
var dataURL = '../data/ALKIS_FHH_0167.xml';
var count = 0;
parseXML(dataURL);
function parseXML(fileName) {
var fileStream = fs.createReadStream(fileName);
var streamer = new saxPath.SaXPath(saxParser, '//gml:featureMember');
streamer.on('match', function(xml) {
addFeature(xml);
});
fileStream.pipe(saxParser);
}
function addFeature (featureFragment) {
// for now we just count features...
if (count % 100 == 0) {
console.log("Parsing fragment " + count);
}
count++;
}
它有一个比直接使用 sax.js 更好的 API。我注意到的唯一警告是解析有时会停止几秒钟,可能是由于 GC 所致。我使用最大 1.7GB 的 XML 文件对此进行了测试。
关于javascript - node.js - 从大型 XML 文件中提取 XML 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34721945/