NodeJS xml -stream, анализ неизвестных узлов - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужен мощный пакет для разбора больших XML файлов, и я натолкнулся на xml -stream . Это здорово, но по какой-то причине я не могу найти способ разбора неизвестных узлов, он ожидает, что я отправлю ожидаемое поле в качестве параметра.

Это файл XML

<Offers>
<Offer>
    <Model>
        694547
    </Model>
    <RegularPrice>
        219.00
    </RegularPrice>
    <ParentSKU>
        654987
    </ParentSKU>
</Offer>
<Offer>
    <Model>
        694548
    </Model>
    <RegularPrice>
        235.00
    </RegularPrice>
    <ParentSKU>
        123456
    </ParentSKU>
</Offer>

И вот код, который я использую

var XmlStream = require('xml-stream'); 
var fs = require('fs');

var stream = fs.createReadStream(filePath);
var xml = new XmlStream(stream);

xml.on('endElement: Offer', function (item) { //<<<- Here I need to add 'Offer' as an expected node
    console.log('loaded', JSON.stringify(item));
});

xml.on('end', function () {
    console.log('END XML');
});

Ответ отличный, как и ожидалось

loaded {"Model":"694547","RegularPrice":"219.00","ParentSKU":"654987"}
loaded {"Model":"694548","RegularPrice":"235.00","ParentSKU":"123456"}
END XML

Как я могу получить тот же список без мне нужно установить «Предложение» в качестве ожидаемого узла? XML, которые я ожидаю получить, могут иметь разные узлы и значения.

1 Ответ

0 голосов
/ 03 февраля 2020

хорошо, в конце концов - я переопределил xml -поток lib. (находится в /xml-stream/lib/xml-stream.js')

xml.on('endElement', function(name) {

  //xml-stream code

  if (self._bufferLevel === 0 && self._emitData) {
    emitEnd.call(self, name);
  }

  //my override <<-----
  if (prev.path.split('/').length == 2) { //the split length check give me the first child
    self.emit('endItem', val);
  }
  //my override end

  curr = prev;
  this._collect = curr.collect;
});

для реализации

  xml.on('endItem', function (item) {
      //single item 
  });
...