Подтвердить что ты не робот

Пытаясь использовать DOMParser с node js

У меня возникают проблемы при попытке использовать DOMParser в моем js-коде. В моем коде я извлекаю xml файл через xmlhttp.responseText мыльный ответ. Я хочу иметь доступ к своим элементам в формате JSON, поэтому мой код выглядит так:

var xml = new DOMParser();
xml = xml.parseFromString(xmlhttp.responseText, 'text/xml');
var result = xmlToJson(xml);

Я получаю это сообщение об ошибке:   ReferenceError: DOMParser не определен

Изменить: Эта ссылка не работала для меня, потому что мой javascript не находится на странице HTML, так как это файл node.js. Доступ к DOMParser JavaScript innerHTML и другие свойства

4b9b3361

Ответ 2

Вы можете использовать Node-реализацию DOMParser, такую как xmldom. Это позволит вам получить доступ к DOMParser за пределами браузера. Например:

var DOMParser = require('xmldom').DOMParser;
var parser = new DOMParser();
var document = parser.parseFromString('Your XML String', 'text/xml');

Ответ 3

Я использовал jsdom, потому что он получил массу использования и написан известным веб-героем - нет никаких обещаний, что его поведение идеально соответствует вашему браузеру (или даже то, что каждое поведение браузера одинаково), но это сработало для меня:

const jsdom = require("jsdom")
const { JSDOM } = jsdom
global.DOMParser = new JSDOM().window.DOMParser

Ответ 4

Мне очень нравится htmlparser2. Это фантастическая, быстрая и легкая библиотека. Я создал небольшую демонстрацию о том, как использовать его в RunKit: https://runkit.com/jfahrenkrug/htmlparser2-demo/1.0.0

Ответ 5

var DOMParser = require('xmldom').DOMParser;
var doc = new DOMParser().parseFromString(
    '<xml xmlns="a" xmlns:c="./lite">\n'+
        '\t<child>test</child>\n'+
        '\t<child></child>\n'+
        '\t<child/>\n'+
    '</xml>'
    ,'text/xml');

Ответ 6

Многие функции браузера, такие как манипуляции с DOM или XHR, изначально недоступны для NodeJS, потому что это не типичная задача сервера для доступа к DOM - для этого вам понадобится внешняя библиотека.

Емкость DOM во многом зависит от библиотеки, вот быстрое сравнение основных инструментов, которые вы можете использовать:

  • jsdom: реализует DOM уровня 4, который является последним стандартом DOM, поэтому все, что вы можете сделать в современном браузере, вы можете сделать это в jsdom:

    const jsdom = require("jsdom");
    const dom = new jsdom.JSDOM('<!DOCTYPE html><p>Hello world</p>');
    dom.window.document.querySelector("p").textContent; // 'Hello world'
    
  • htmlparser2: то же самое, но с улучшенными характеристиками и гибкостью за счет более сложного API:

    const htmlparser = require("htmlparser2");
    const parser = new htmlparser.Parser({
      onopentag: (name, attrib) => {
        if (name=='p') console.log('a paragraph element is opening');
      }
    }, {decodeEntities: true});
    parser.write('<!DOCTYPE html><p>Hello world</p>');
    parser.end();
    // console output: 'a paragraph element is opening'
    
  • cheerio: реализация jQuery на основе анализа HTML DOM с помощью htmlparser2:

    const cheerio = require('cheerio');
    const $ = cheerio.load('<!DOCTYPE html><p>Hello world</p>');
    $('p').text('Bye moon');
    $.html(); // '<!DOCTYPE html><p>Bye moon</p>'
    
  • xmldom: полностью реализует уровень DOM 2 и частично реализует уровень DOM 3. Работает с HTML, а также с XML

  • dom-parser: dom-parser DOM на основе регулярных выражений, который реализует несколько методов DOM, таких как getElementById. Поскольку синтаксический анализ HTML с помощью регулярных выражений - очень плохая идея, я бы не рекомендовал этот вариант для производства.

Ответ 7

Не прямой ответ, но в зависимости от вашего приложения вы можете использовать парсер JSX (используется React.js) https://github.com/RReverser/acorn-jsx