关于javascript:尝试将DOMParser与node js一起使用

Trying to use the DOMParser with node js

在我的js代码中尝试使用DOMParser时遇到问题。在我的代码中,我通过xmlhttp.responseText soap响应检索了一个xml文件。我希望能够以JSON格式访问其元素,因此我的代码如下所示:

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

我收到此错误消息:
ReferenceError:未定义DOMParser

编辑:
该链接对我不起作用,因为我的JavaScript不在HTML页面中,因为它是一个node.js文件。 JavaScript DOMParser访问innerHTML和其他属性


NodeJS本身不提供许多浏览器功能,例如DOM操作或XHR,因为这不是访问DOM的典型服务器任务-您必须使用外部库来执行此操作。

DOM的功能在很大程度上取决于库,以下是您可以使用的主要工具的快速比较:

  • jsdom:实现DOM级别4,这是最新的DOM标准,因此您可以在现代浏览器中执行的所有操作都可以在jsdom中进行。 Mocha,Vue Test Utils,Webpack Prerender SPA插件和许多其他应用程序使用的事实上的行业标准,用于在Node上进行浏览器操作。

    1
    2
    3
    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为代价具有增强的性能和灵活性:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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:通过htmlparser2

    的基于HTML DOM解析的jQuery实现

    1
    2
    3
    4
    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解析器,实现了一些getElementById之类的DOM方法。由于用正则表达式解析HTML是一个非常糟糕的主意,因此我不建议将其用于生产。


node.js中没有DOMParser,这是浏览器。您可以尝试以下任何模块:

https://github.com/joyent/node/wiki/modules#wiki-parsers-xml


我之所以使用jsdom,是因为它有大量用法,并且是由著名的网络英雄编写的-不保证它的行为与您的浏览器完全匹配(甚至每个浏览器的行为都相同),但是它对我有用:

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

您可以使用DOMParser的Node实现,例如xmldom。这将允许您在浏览器外部访问DOMParser。例如:

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


我真的很喜欢htmlparser2。这是一个梦幻般的,快速且轻量级的库。我已经创建了一个关于如何在RunKit上使用它的小演示:https://runkit.com/jfahrenkrug/htmlparser2-demo/1.0.0


1
2
3
4
5
6
7
8
9
10
11
12
var DOMParser = require('xmldom').DOMParser;
var doc = new DOMParser().parseFromString(
    '<xml xmlns="a" xmlns:c="./lite">\
'
+
        '\\t<child>test</child>\
'
+
        '\\t<child></child>\
'
+
        '\\t<child/>\
'
+
    '</xml>'
    ,'text/xml');

不是直接的答案,但是根据您的应用程序,您可以使用JSX解析器(由React.js使用)https://github.com/RReverser/acorn-jsx