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