Приветствую.
Работал с
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.
Буду благодарен, если кто-то сможет помочь разобраться в этой проблеме, или предложит альтернативы.