尝试将 DOMParser 与节点 js 一起使用

IT技术 javascript xml node.js
2021-01-27 19:22:33

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

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

我收到此错误消息:ReferenceError: DOMParser is not defined

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

6个回答

许多浏览器功能,如 DOM 操作或 XHR,在 NodeJS 中是不可用的,因为这不是访问 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(`<!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:基于 HTML DOM 解析的 jQuery 实现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 解析器,它实现了一些 DOM 方法,例如getElementById. 由于使用正则表达式解析 HTML 是一个非常糟糕的主意,因此我不建议将其用于生产。

DOMParsernode.js 中没有,那是浏览器的事情。不过,您可以尝试这些module中的任何一个:

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

我知道这个线程很旧,但它在这里。节点的jquery怎么样?带有数据类型 xml 的 ajax 调用应该收到一个 xml dom 响应。
2021-03-31 19:22:33

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

var DOMParser = require('xmldom').DOMParser;
var parser = new DOMParser();
var document = parser.parseFromString('Your XML String', 'text/xml');
xmldom是 DOMParser 的糟糕替代品。它没有正确解析对等元素。
2021-03-21 19:22:33
它满足了我的需求,因为我实际上是在实现这个逻辑!谢谢,gist.github.com/chinchang/8106a82c56ad007e27b1
2021-03-23 19:22:33
xmldom 是一个古老的库。没有 querySelector 支持
2021-03-26 19:22:33
它不起作用 - 尝试解析 html 页面时只会吐出很多错误“找不到实体”
2021-04-13 19:22:33

我使用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