web-dev-qa-db-ja.com

ノードjsでDOMParserを使用しようとしています

JsコードでDOMParserを使用しようとすると、問題が発生します。私のコードでは、xmlhttp.responseText soap応答を介してxmlファイルを取得します。 JSON形式の要素にアクセスできるようにしたいので、コードは次のようになります。

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

次のエラーメッセージが表示されます:ReferenceError:DOMParser is not defined

編集:このリンクはnode.jsファイルであるため、私のJavaScriptはHTMLページにないため、私にとってはうまくいきませんでした。 JavaScript DOMParserはinnerHTMLおよびその他のプロパティにアクセスします

32
Stephen D

Node.jsにはDOMParserがありません。これはブラウザのことです。ただし、これらのモジュールはどれでも試すことができます。

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

14
Esailija

Node xmldom などのDOMParserの実装を使用できます。これにより、ブラウザの外部でDOMParserにアクセスできます。例:

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

jsdom を使用したのは、大量の使用方法があり、著名なWebヒーローによって書かれているためです-動作がブラウザに完全に一致するという約束はありません(または、すべてのブラウザの動作が同じであるということさえありません)私:

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

DOM操作やXHRなど、多くのブラウザ機能はNodeJSでネイティブに使用できません。これは、DOMにアクセスするための一般的なサーバータスクではないためです。これを行うには外部ライブラリを使用する必要があります。

DOMの容量はライブラリに大きく依存します。使用できる主なツールの簡単な比較を次に示します。

  • jsdom最新のDOM標準 であるDOMレベル4を実装しているため、できることはすべて最新のブラウザでは、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:同じですが、より複雑な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'
    
  • cheeriohtmlparser2による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-parsergetElementByIdのようないくつかのDOMメソッドを実装する正規表現ベースのDOMパーサー。正規表現を使用したHTMLの解析は 非常に悪い考え なので、実稼働環境ではこれをお勧めしません。

7
Nino Filiu

htmlparser2 が本当に好きです。素晴らしく、高速で軽量なライブラリです。 RunKitでの使用方法に関する小さなデモを作成しました: https://runkit.com/jfahrenkrug/htmlparser2-demo/1.0.

3

直接的な答えではありませんが、アプリケーションによっては、JSXパーサー(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