Странная ошибка при использовании модуля 'node-htmlparser' - PullRequest
1 голос
/ 15 декабря 2011

Я читаю бегемота файла 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() перед циклом.

...