Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to use the DOMParser with node js

I am running into issues when trying to use the DOMParser in my js code. In my code, I retrieve an xml file via xmlhttp.responseText soap response. I want to be able to access its elements in JSON format, so my code looks like:

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

I get this error message: ReferenceError: DOMParser is not defined

Edit: This link hasn't worked for me because my javascript isn't in the HTML page, as it is a node.js file. JavaScript DOMParser access innerHTML and other properties

like image 505
Stephen D Avatar asked Jul 09 '12 15:07

Stephen D


1 Answers

A lot of browser functionalities, like DOM manipulations or XHR, are not available natively NodeJS because that is not a typical server task to access the DOM - you'll have to use an external library to do that.

DOM capacities depends a lot on the library, here's a quick comparisons of the main tools you can use:

  • jsdom: implements DOM level 4 which is the latest DOM standard, so everything that you can do on a modern browser, you can do it in jsdom. It is the de-facto industry standard for doing browser stuff on Node, used by Mocha, Vue Test Utils, Webpack Prerender SPA Plugin, and many other:

    const jsdom = require("jsdom"); const dom = new jsdom.JSDOM(`<!DOCTYPE html><p>Hello world</p>`); dom.window.document.querySelector("p").textContent; // 'Hello world' 
  • deno_dom: if using Deno instead of Node is an option, this library provides DOM parsing capabilities:

    import { DOMParser } from "https://deno.land/x/deno_dom/deno-dom-wasm.ts"; const parser = new DOMParser(); const document = parser.parseFromString('<p>Hello world</p>', 'text/html'); document.querySelector('p').textContent; // 'Hello world'; 
  • htmlparser2: same as jsdom, but with enhanced performances and flexibility at the price of a more complex 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: implementation of jQuery based on HTML DOM parsing by 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: fully implements the DOM level 2 and partially implements the DOM level 3. Works with HTML, and with XML also

  • dom-parser: regex-based DOM parser that implements a few DOM methods like getElementById. Since parsing HTML with regular expressions is a very bad idea I wouldn't recommend this one for production.

like image 115
Nino Filiu Avatar answered Sep 16 '22 19:09

Nino Filiu