Ответ 1
В node.js нет DOMParser
, что есть браузер. Вы можете попробовать любой из этих модулей:
https://github.com/joyent/node/wiki/modules#wiki-parsers-xml
У меня возникают проблемы при попытке использовать 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 и другие свойства
В node.js нет DOMParser
, что есть браузер. Вы можете попробовать любой из этих модулей:
https://github.com/joyent/node/wiki/modules#wiki-parsers-xml
Вы можете использовать Node-реализацию DOMParser, такую как xmldom. Это позволит вам получить доступ к DOMParser за пределами браузера. Например:
var DOMParser = require('xmldom').DOMParser;
var parser = new DOMParser();
var document = parser.parseFromString('Your XML String', 'text/xml');
Я использовал jsdom, потому что он получил массу использования и написан известным веб-героем - нет никаких обещаний, что его поведение идеально соответствует вашему браузеру (или даже то, что каждое поведение браузера одинаково), но это сработало для меня:
const jsdom = require("jsdom")
const { JSDOM } = jsdom
global.DOMParser = new JSDOM().window.DOMParser
Мне очень нравится htmlparser2. Это фантастическая, быстрая и легкая библиотека. Я создал небольшую демонстрацию о том, как использовать его в RunKit: https://runkit.com/jfahrenkrug/htmlparser2-demo/1.0.0
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');
Многие функции браузера, такие как манипуляции с 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 с помощью регулярных выражений - очень плохая идея, я бы не рекомендовал этот вариант для производства.
Не прямой ответ, но в зависимости от вашего приложения вы можете использовать парсер JSX (используется React.js) https://github.com/RReverser/acorn-jsx