我正在尝试将从url获得的rss feed解析为json。我已经以这种方式实现了xml-stream
class FromStreamableXML extends Parser {
constructor() {
super('xmlStream');
}
setupRequestStream(link) {
return new Promise((resolve, reject) => {
const req = request(link, res => {
resolve(res);
});
req.on('error', err => {
reject(err);
});
req.end();
});
}
setupFileStream(path) {
return Promise.resolve(createReadStream(path));
}
async toJs({ path, itemToSelect, identifier, type }) {
let streamSource;
if (type === 'url') {
streamSource = this.setupRequestStream;
} else if (type === 'file') {
streamSource = this.setupFileStream;
}
const itemsMap = {};
const items = [];
const stream = await streamSource(path);
const myXML = new this.xmlStream(stream);
return new Promise((resolve, reject) => {
myXML.on(`endElement: ${itemToSelect}`, item => {
if (identifier) {
if (!itemsMap[identifier]) {
itemsMap[identifier] = [];
}
itemsMap[identifier].push(item);
} else {
items.push(item);
}
});
myXML.on('end', () => {
if (identifier) {
resolve(itemsMap);
} else {
resolve(items);
}
})
});
}
}
我使用toJs
方法收集所有item
属性,然后在end
上解析收集的项目。但是,情况是xml-stream
不能收集所有项目,事实上,它收集的项目数是随机的。例如,某个URL包含200
个项目,但是,有时我会收到53,有时是15。我通过在endElement
回调中记录该项目来进行检查。
当前,我使用url进行了测试,因此我正在使用请求流。 request
方法来自https
模块。
任何想法为什么会这样?