Я читаю бегемота файла XML, строка за строкой.Используя htmlparser (v1.7.3), я пытаюсь получить значения атрибутов, которые в конечном итоге будут записаны в базу данных.
Вот код:
var fs = require('fs');
var sys = require('util');
var htmlparser = require('htmlparser');
function parseFoo(fileName) {
var stream = fs.createReadStream(fileName);
var buffer = "";
stream.addListener('data', function(data) {
buffer += data.toString();
var parts = buffer.split('\n');
parts.forEach(function(part, i) {
record.buildRecord(part);
})
buffer = parts.pop(); // Add remaining text to the buffer.
})
}
var record = (function() {
var handler = new htmlparser.DefaultHandler(function (error, dom) {});
var parser = new htmlparser.Parser(handler);
return {
'buildRecord': function(xml) {
parser.parseComplete(xml);
// Only for testing.
console.error(sys.inspect(handler.dom[0]['children'][0], false, null));
}
};
})();
parseFoo('foo.xml');
'foo.xml' (в кодировке UTF-8) тривиален, он состоит из gazillion строк, например:
<w a="1" b="2" c="3" d="4">x</w>
Когда программа достигает определенной строки (1204), я получаю ошибку:
D:\Geci\foo.js:25
console.error(sys.inspect(handler.dom[0]['children'][0], false, null));
TypeError: Cannot read property '0' of undefined
at Object.buildRecord (D:\Geci\foo.js:26:59)
at D:\Geci\foo.js:14:14
at Array.forEach (native)
at [object Object].<anonymous> (D:\Geci\foo.js:13:11)
at [object Object].emit (events.js:67:17)
at [object Object]._emitData (fs.js:1149:10)
at afterRead (fs.js:1131:10)
at Object.wrapper [as oncomplete] (fs.js:254:17)
Я запускаю это с версией Windows для node.js (0.6.5.1).
Это ошибка в htmlparser, или я просто являюсь новичком в node.js?
РЕДАКТИРОВАТЬ: эта ошибка была решена путем добавления слушателя 'end' в stream
, где я особенно внимательно отношусь к последней строке.Плюс движение parts.pop()
перед циклом.