109 votes

Essayer d'utiliser le DOMParser avec node js

Je rencontre des problèmes lorsque j'essaie d'utiliser le DOMParser dans mon code JavaScript. Dans mon code, je récupère un fichier xml via la réponse soap xmlhttp.responseText. Je veux être capable d'accéder à ses éléments au format JSON, donc mon code ressemble à ça :

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

Je reçois ce message d'erreur : ReferenceError : DOMParser n'est pas défini

Éditer : Ce lien n'a pas fonctionné pour moi car mon javascript n'est pas dans la page HTML, c'est un fichier node.js. Accès au DOMParser JavaScript innerHTML et autres propriétés

119voto

Nino Filiu Points 3662

Beaucoup de fonctionnalités du navigateur, comme les manipulations DOM ou XHR, ne sont pas disponibles nativement NodeJS parce que ce n'est pas une tâche typique du serveur pour accéder au DOM - vous devrez utiliser une bibliothèque externe pour le faire.

Les capacités des DOM dépendent beaucoup de la bibliothèque, voici une comparaison rapide des principaux outils que vous pouvez utiliser :

  • jsdom : implémente le niveau 4 de DOM qui est la dernière norme DOM Ainsi, tout ce que l'on peut faire sur un navigateur moderne, on peut le faire en jsdom . C'est la norme de facto de l'industrie pour faire des trucs de navigateur sur Node, utilisée par Mocha, Vue Test Utils, Webpack Prerender SPA Plugin, et beaucoup d'autres :

    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 Si l'utilisation de Deno au lieu de Node est une option, cette bibliothèque fournit des capacités d'analyse syntaxique 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 : identique à jsdom, mais avec des performances et une flexibilité accrues au prix d'une API plus complexe :

    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 : implémentation de jQuery basée sur l'analyse du DOM HTML par 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 : implémente complètement le DOM niveau 2 et partiellement le DOM niveau 3. Fonctionne avec HTML, et aussi avec XML

  • dom-parser : analyseur DOM basé sur les regex qui implémente quelques méthodes DOM comme getElementById . Puisque l'analyse du HTML avec des expressions régulières est une très mauvaise idée Je ne le recommanderais pas pour la production.

17voto

Esailija Points 74052

Il n'y a pas DOMParser dans node.js, c'est un truc de navigateur. Vous pouvez cependant essayer n'importe lequel de ces modules :

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

15voto

Chris Alley Points 1143

Vous pouvez utiliser une implémentation Node de DOMParser, telle que xmldom . Cela vous permettra d'accéder à DOMParser en dehors du navigateur. Par exemple :

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

15voto

Jon z Points 793

J'ai utilisé jsdom parce qu'il est très utilisé et qu'il a été écrit par un éminent héros du web - je ne promets pas que son comportement corresponde parfaitement à celui de votre navigateur (ou même que le comportement de tous les navigateurs soit le même) mais il a fonctionné pour moi :

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

4voto

Johannes Fahrenkrug Points 12795

J'aime vraiment htmlparser2 . C'est une bibliothèque fantastique, rapide et légère. J'ai créé une petite démo sur la façon de l'utiliser sur RunKit : https://runkit.com/jfahrenkrug/htmlparser2-demo/1.0.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X