парсинг xml для извлечения текста определенного тега с использованием htmlparser2 - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать node-htmlparser2 и застрял прямо в самом начале.У меня есть тысячи XML-файлов, например:

<document … loads of attribs …>
    <foo … loads of attribs …>
        <loads…> … </loads>
        <of…> … </of>
        <other…> … </other>
        <tags…> … </tags>
    </foo>
</document>

Я хочу, чтобы все внутри <foo></foo> было одной строкой.Мой код ниже работает, но мне не кажется, что это правильный путь

let isFoo = false;
let txt = '';
const p = new htmlparser.Parser({
    onopentag: function(name, attribs){
        if (name === 'foo') {
            isFoo = true;
        }
    },
    ontext: function(text){
        if (isFoo) {
            txt += text;
        }
    },
    onclosetag: function(tagname){
        if (tagname === 'foo') {
            isFoo = false;
            return txt;
        }
    }
}, {decodeEntities: true, xmlMode: true});

let data = [];
for (let file in files) {
    let record = {
        filename: file,
        filetext: p.write(file)
    }
    data.push(record);
    p.end();
}

Есть ли лучший способ работать с htmlparser2 без этого глупого isFoo флага?

1 Ответ

0 голосов
/ 31 января 2019

Вот возможный путь, вдохновленный примером, приведенным на странице NPM DomHandler , и уродливым console.log на h.DomUtils.

const h = require('htmlparser2');
const fs = require('fs');
const data = []; // your output

files.map((file) => { // files is assumed to be populated
  const record = {
    filename: file
  };
  data.push(record);
  const dh = new h.DomHandler((err, dom) => {
    if (err) return record.err = err;
    // DomUtils has many useful methods, most of them you know already, pick your preferred
    const e = h.DomUtils.getElementsByTagName('foo', dom)[0];
    // getText: only text nodes, getInnerHTML: everything, inner tags included
    record.filetext = h.DomUtils.getText(e);
  });
  const parser = new h.Parser(dh, {decodeEntities: true, xmlMode: true});
  fs.readFile(file, (err, content) => {
    if (err) return record.err = err;
    parser.write(content);
    parser.end();
  });
});

...