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

时间:2012-07-09 15:37:45

标签: javascript xml node.js

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

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

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

编辑: 此链接对我不起作用,因为我的javascript不在HTML页面中,因为它是node.js文件。 JavaScript DOMParser access innerHTML and other properties

8 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:4)

我之所以使用jsdom是因为它用途很多,并且是由著名的网络英雄撰写的-不能保证它的行为与您的浏览器完全匹配(甚至每个浏览器的行为都相同),但是它适用于我:

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

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

  • jsdom :实现DOM级别4,即the latest DOM standard,因此您可以在现代浏览器中进行的所有操作,都可以在{{1 }}:

    jsdom
  • htmlparser2 :相同,但以更复杂的API为代价,具有增强的性能和灵活性:

    const jsdom = require("jsdom");
    const dom = new jsdom.JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
    dom.window.document.querySelector("p").textContent; // 'Hello world'
    
  • cheerio :通过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' 解析基于HTML DOM的jQuery实现:

    htmlparser2
  • xmldom :完全实现DOM级别2,部分实现DOM级别3。与HTML以及XML一起使用

  • dom-parser :基于正则表达式的DOM解析器,可实现一些const cheerio = require('cheerio'); const $ = cheerio.load(`<!DOCTYPE html><p>Hello world</p>`); $('p').text('Bye moon'); $.html(); // '<!DOCTYPE html><p>Bye moon</p>' 之类的DOM方法。由于使用正则表达式解析HTML是a very bad idea,因此我不建议将此代码用于生产环境。

答案 5 :(得分:0)

var 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');

答案 6 :(得分:0)

我使用另一个 DOM 解析器从 html 字符串到 DOM 并返回 > Himalaya,或在 npmjs.com

import { parse, stringify } from 'himalaya';

const dom = parse(htmlString)

// Do something here

const htmlStringNext = stringify(dom)

答案 7 :(得分:-1)

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