尝试在Node.js中使用DOMParser。

20 浏览
0 Comments

尝试在Node.js中使用DOMParser。

我在尝试在我的js代码中使用DOMParser时遇到了问题。在我的代码中,我通过xmlhttp.responseText的soap响应来获取一个xml文件。我希望能以JSON格式访问它的元素,所以我的代码如下:\n

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

\n我收到了这个错误消息:\n ReferenceError: DOMParser is not defined\n编辑:\n这个链接对我没有起作用,因为我的JavaScript不在HTML页面中,而是一个node.js文件。

0
0 Comments

问题出现的原因是在使用DOMParser解析html页面时,出现了"entity not found"的错误。此外,xmldom这个库也存在一些问题,比如不支持querySelector和无法正确解析同级元素。

解决方法是使用Node中的DOMParser的实现,比如xmldom库。以下是一个示例代码:

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

xmldom库是一个旧的库,不支持querySelector功能。然而,xmldom并不能很好地替代DOMParser,因为它无法正确解析同级元素。

如果需要使用querySelector功能,可以考虑使用其他替代库。另外,也可以参考gist.github.com/chinchang/8106a82c56ad007e27b1中的代码实现。

此外,还有一个新的替代库可以使用,即npmjs.com/package//xmldom。可以将其作为xmldom库的替代品。

通过使用Node中的DOMParser实现,我们可以在Node环境中使用DOMParser,并解决了使用DOMParser解析html页面时出现的"entity not found"错误。同时,我们也了解到xmldom这个库的一些问题,并介绍了其他可替代的库。

0
0 Comments

问题的出现原因是在Node.js环境中使用DOMParser时遇到了问题。作者尝试使用jsdom库来解决这个问题,因为该库被广泛使用,并且由一位著名的网络英雄编写。虽然该库的行为可能不完全与浏览器相匹配(甚至不同浏览器的行为可能也不尽相同),但对于作者来说,它是有效的。

解决方法是使用jsdom库和DOMParser来模拟浏览器环境。首先,需要引入jsdom库并使用其提供的JSDOM对象。然后,将全局的DOMParser对象设置为新创建的JSDOM实例的window对象中的DOMParser属性。

以下是解决方法的代码示例:

const jsdom = require("jsdom")

const { JSDOM } = jsdom

global.DOMParser = new JSDOM().window.DOMParser

这种方法非常好,特别是当第三方库依赖于DOMParser时。这样做可以在Node.js环境中模拟浏览器环境,使得使用DOMParser的库能够正常工作。

0
0 Comments

在Node.js中,许多浏览器功能(如DOM操作或XHR)在原生环境下是不可用的,因为访问DOM不是典型的服务器任务 - 您必须使用外部库来完成这个任务。

DOM的功能取决于所使用的库,以下是您可以使用的主要工具的快速比较:

- jsdom:实现了DOM级别4,这是最新的DOM标准,因此您可以在jsdom中做任何现代浏览器上的操作。它是用于在Node上进行浏览器相关操作的事实行业标准,被Mocha、Vue Test Utils、Webpack Prerender SPA Plugin等许多工具使用。

const jsdom = require("jsdom");
const dom = new jsdom.JSDOM(`

Hello world

`); dom.window.document.querySelector("p").textContent; // 'Hello world'

- deno_dom:如果使用Deno而不是Node是一个选项,该库提供了DOM解析功能。

import { DOMParser } from "https://deno.land/x/deno_dom/deno-dom-wasm.ts";
const parser = new DOMParser();
const document = parser.parseFromString('

Hello world

', 'text/html'); document.querySelector('p').textContent; // 'Hello world';

- htmlparser2:与jsdom相同,但具有更高的性能和灵活性,代价是更复杂的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(`

Hello world

`); parser.end(); // console output: 'a paragraph element is opening'

- cheerio:基于htmlparser2的HTML DOM解析的jQuery实现。

const cheerio = require('cheerio');
const $ = cheerio.load(`

Hello world

`); $('p').text('Bye moon'); $.html(); // '

Bye moon

'

- xmldom:完全实现了DOM级别2,部分实现了DOM级别3。适用于HTML和XML。

- dom-parser:基于正则表达式的DOM解析器,实现了一些DOM方法(如getElementById)。由于使用正则表达式解析HTML是一个非常糟糕的想法,我不建议将其用于生产环境。

如果您想在Node.js中使用DOMParser,您需要使用外部库,如jsdom、deno_dom、htmlparser2、cheerio、xmldom或dom-parser。这些库提供了不同级别的DOM功能和API,您可以根据需求选择适合您的库。

0