web-dev-qa-db-fra.com

Essayer d'utiliser DOMParser avec le noeud js

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

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

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

25
Stephen D

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

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

15
Esailija

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');
10
Chris Alley

De nombreuses fonctionnalités du navigateur, telles que les manipulations DOM ou XHR, ne sont pas disponibles nativement NodeJS car ce n'est pas une tâche de serveur typique d'accéder au DOM. Vous devrez utiliser une bibliothèque externe pour le faire.

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

  • jsdom: implémente le niveau de DOM 4 qui est le dernier standard DOM , donc tout ce que vous pouvez faire sur un navigateur moderne, vous pouvez le faire dans jsdom:

    _const jsdom = require("jsdom");
    const dom = new jsdom.JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
    dom.window.document.querySelector("p").textContent; // 'Hello world'
    _
  • htmlparser2: idem, mais avec des performances améliorées et une flexibilité 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 syntaxique HTML du DOM 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 niveau de DOM 2 et implémente partiellement le niveau de DOM 3. Fonctionne avec HTML et XML également

  • dom-parser: analyseur DOM basé sur les expressions rationnelles qui implémente quelques méthodes DOM comme getElementById. Puisque l’analyse HTML avec des expressions régulières est ne très mauvaise idée , je ne recommanderais pas celui-ci pour la production.

4
Nino Filiu

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

2
Johannes Fahrenkrug

J'ai utilisé jsdom car il a énormément d'utilisation et est écrit par un héros web de premier plan - rien ne garantit que son comportement correspond parfaitement à votre navigateur (ou même que le comportement de chaque navigateur est identique), mais cela a fonctionné pour moi:

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

Pas une réponse directe, mais en fonction de votre application, vous pouvez utiliser l'analyseur JSX (utilisé par React.js) https://github.com/RReverser/acorn-jsx

0
Rafael Xavier
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');
0
Anjali