@kto_to

Node.js: stream (sax.js) — потеря данных в потоковой обработке файла?

Приветствую.
Работал с xml файлами при помощи xml2js пока не пришлось работать с фалами большого размера.
Полистав интернет, решил использовать для этих целей sax и saxpath.
Но тут, при обработки некоторых файлов возникла новая проблема: «Unexpected close tag»
events.js:72
throw er; // Unhandled 'error' event
^
Error: Unexpected close tag
Line: 819060
Column: 36
Char: >
at error (d:\js\node_prog\xml_parse\node_modules\sax\lib\sax.js:652:8)
at strictFail (d:\js\node_prog\xml_parse\node_modules\sax\lib\sax.js:672:22)
at closeTag (d:\js\node_prog\xml_parse\node_modules\sax\lib\sax.js:867:7)
at Object.write (d:\js\node_prog\xml_parse\node_modules\sax\lib\sax.js:1341:29)
at SAXStream.write (d:\js\node_prog\xml_parse\node_modules\sax\lib\sax.js:227:16)
at ReadStream. (d:\js\node_prog\xml_parse\pdm_xml_2.js:36:15)
at ReadStream.EventEmitter.emit (events.js:95:17)
at ReadStream. (_stream_readable.js:745:14)
at ReadStream.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:407:10)


Пытаясь разобраться в этой проблеме, выяснил, что ошибка возникает в тот момент, когда в функцию write(), модуля sax, в chunk поступают данные с потерей двух символов. Т.е. граница двух порций данных находится на имени тега, и поскольку на границе теряется 2 символа (либо в конце первой порции данных, либо в начале следующей), - парсер получает несуществующее имя тега и выдает ошибку "Unexpected close tag"

Пример моего кода:
'use strict';
var saxpath = require('saxpath');
var fs = require('fs');
var sax = require('sax');

var saxParser = sax.createStream(true);
var streamer = new saxpath.SaXPath(saxParser, '//items/items');

streamer.on('match', function (xml) {
    // do somthing with xml
    // console.log(xml);
});

var xmlFileName = 'xml_files/MyFileName.xml';

function createClearString(origString) {
    return origString.replace("\ufeff", "");
}

var readable = fs.createReadStream(xmlFileName);
readable.on('data', function (buf) {
    buf.write(createClearString(buf.toString('utf8')));
    saxParser.write(buf);
});


Функция createClearString() добавлена для замены непечатаемых символов в начале файла, которые вызывали ошибку.

Для тех кто найдет время, один из файлов на котором возникает описанная ошибка: GoogleDrive, Mega
Приведенный лог ошибки получен при обработке указанного файла. Но
Line: 819060
Column: 36
не соответствует действительности. В этом файле в теге description пропали символы sc (а это 819061 строка, если верить сублайму). Один chunk закончился на de, а второй начался с ription.

Буду благодарен, если кто-то сможет помочь разобраться в этой проблеме, или предложит альтернативы.
  • Вопрос задан
  • 613 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы