Вопрос:
У меня возникают проблемы при попытке использовать 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
Ответ №1
Вы можете использовать Node-реализацию DOMParser, такую как xmldom. Это позволит вам получить доступ к DOMParser за пределами браузера. Например:
var DOMParser = require(‘xmldom’).DOMParser; var parser = new DOMParser(); var document = parser.parseFromString(‘Your XML String’, ‘text/xml’); Ответ №2
Я использовал jsdom, потому что он получил массу использования и написан известным веб-героем – нет никаких обещаний, что его поведение идеально соответствует вашему браузеру (или даже то, что каждое поведение браузера одинаково), но это сработало для меня:
const jsdom = require(«jsdom») const { JSDOM } = jsdom global.DOMParser = new JSDOM().window.DOMParser Ответ №3
Мне очень нравится htmlparser2. Это фантастическая, быстрая и легкая библиотека. Я создал небольшую демонстрацию о том, как использовать его в RunKit:
Ответ №4var 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’); Ответ №5
Многие функции браузера, такие как манипуляции с 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 с помощью регулярных выражений – очень плохая идея, я бы не рекомендовал этот вариант для производства.
Ответ №6
Не прямой ответ, но в зависимости от вашего приложения вы можете использовать парсер JSX (используется React.js) https://github.com/RReverser/acorn-jsx