node.js - NodeJS xml-stream,解析未知节点
问题描述
我需要一个强大的包来解析大型 XML 文件,我遇到了xml-stream。这很棒,但由于某种原因,我似乎无法找到如何解析未知节点,它希望我将预期的字段作为参数发送。
那是XML文件
<Offers>
<Offer>
<Model>
694547
</Model>
<RegularPrice>
219.00
</RegularPrice>
<ParentSKU>
654987
</ParentSKU>
</Offer>
<Offer>
<Model>
694548
</Model>
<RegularPrice>
235.00
</RegularPrice>
<ParentSKU>
123456
</ParentSKU>
</Offer>
这是我使用的代码
var XmlStream = require('xml-stream');
var fs = require('fs');
var stream = fs.createReadStream(filePath);
var xml = new XmlStream(stream);
xml.on('endElement: Offer', function (item) { //<<<- Here I need to add 'Offer' as an expected node
console.log('loaded', JSON.stringify(item));
});
xml.on('end', function () {
console.log('END XML');
});
反应很好,正如预期的那样
loaded {"Model":"694547","RegularPrice":"219.00","ParentSKU":"654987"}
loaded {"Model":"694548","RegularPrice":"235.00","ParentSKU":"123456"}
END XML
如何获得相同的列表而无需将“Offer”设置为预期节点?我期望得到的 XML 可以有不同的节点和值。
解决方案
好的,最后 - 我已经覆盖了 xml-stream 库。(位于'/xml-stream/lib/xml-stream.js')
xml.on('endElement', function(name) {
//xml-stream code
if (self._bufferLevel === 0 && self._emitData) {
emitEnd.call(self, name);
}
//my override <<-----
if (prev.path.split('/').length == 2) { //the split length check give me the first child
self.emit('endItem', val);
}
//my override end
curr = prev;
this._collect = curr.collect;
});
实施
xml.on('endItem', function (item) {
//single item
});
推荐阅读
- ruby-on-rails-5 - 在创建和更新函数的任何地方重定向和呈现不发送浏览器
- react-native - 我想创建两个导航菜单
- angular - 如何在使用打字稿的Angular + Protractor e2e测试中检查元素是否具有colspan属性
- node.js - 使用 loopback / express.js 下载文件
- parsing - VALUE 参数无法解析为数字(Google 电子表格错误)
- php - PHP串行适用于Windows,但不适用于Linux
- android - Cloud SQL v1beta4API 是访问 Cloud SQL 数据库信息还是数据库数据?
- sql-server - 需要 SQL 查询以获得所需的输出
- python - Python pandas 选择条件为什么要像 frame[frame['col1'].notna()] 那样写两次数据框名称?
- python - 如何合并一列列表,提取唯一的字符串值,放入数据框