尝试在node js中使用DOMParser

68bkxrlz  于 2023-03-29  发布在  Node.js
关注(0)|答案(8)|浏览(449)

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

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

我收到此错误消息:参考错误:未定义DOMParser
编辑:这个链接对我不起作用,因为我的javascript不在HTML页面中,因为它是一个node.js文件。JavaScript DOMParser access innerHTML and other properties

zwghvu4y

zwghvu4y1#

许多浏览器功能,如DOM操作或XHR,在NodeJS中是不可用的,因为这不是访问DOM的典型服务器任务-您必须使用外部库才能完成。
DOM容量很大程度上取决于库,这里是您可以使用的主要工具的快速比较:

*jsdom:实现了DOM level 4,这是最新的DOM标准,所以你可以在现代浏览器上做的所有事情,你都可以在jsdom中完成。它是在Node上做浏览器工作的事实上的行业标准,被Mocha,Vue Test Utils,Webpack Prerender SPA插件和许多其他人使用:

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:如果可以选择使用Deno而不是Node,则此库提供DOM解析功能:

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:与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(`<!DOCTYPE html><p>Hello world</p>`);
parser.end();
// console output: 'a paragraph element is opening'

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

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:基于regex的DOM解析器,实现了一些DOM方法,如getElementById。由于使用正则表达式解析HTML是a very bad idea,因此我不建议将其用于生产环境。

hec6srdp

hec6srdp2#

我使用jsdom是因为它有大量的使用,并且是由一位杰出的网络英雄编写的-不能保证它的行为完全匹配您的浏览器(甚至每个浏览器的行为都是相同的),但它对我有效:

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

ddrv8njm3#

node.js中没有DOMParser,这是浏览器的问题。不过,您可以尝试以下任何模块:
https://github.com/joyent/node/wiki/modules#wiki-parsers-xml

swvgeqrz

swvgeqrz4#

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

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

bxgwgixi5#

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

zed5wv10

zed5wv106#

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

v09wglhw7#

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

import { parse, stringify } from 'himalaya';

const dom = parse(htmlString)

// Do something here

const htmlStringNext = stringify(dom)
ffdz8vbo

ffdz8vbo8#

RSS parser很容易解析Atom提要。例如,如果您使用NextJs,您可以简单地创建一个API,如下所示:

import Parser from 'rss-parser'

export default async function API(req, res) {
    let parser = new Parser();
    try {
        const feed = await parser.parseURL(`https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss`);
        if (feed) return res.json({ "message": `Here is your data feed title`, status: 200, data: feed.title })
    } catch (error) {
        return res.json({ "message": "You made an invalid request", status: 401 })
    }
}

相关问题