質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1404閲覧

XPathEvaluator等とdocument.evaluateの使い分け

_kari_

総合スコア34

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/10/23 02:57

JavaScriptでXPathを使いたいとき、document.evaluate()を使うことが多いと思います。

私はむしろつい最近までdocument.evaluate()しか知らなかったのですが、MDNでXPathEvaluatorの存在を知りました。
私の現在の理解では、XPathEvaluatorもdocument.evaluateと同じようにJavaScriptでXPathを評価するのに使えます。

しかも、そのXPathEvaluatorも使い方が1通りではなく、

①XPathEvaluatorオブジェクトのevaluateメソッドを呼ぶ方法

JavaScript

1const evaluator = new XPathEvaluator(); 2const result = evaluator.evaluate("//body", document, null, XPathResult.ANY_UNORDERED_NODE_TYPE); 3console.log(result.singleNodeValue);

と、

②XPathExpressionオブジェクトを生成して、そちらのevaluateメソッドを呼ぶ方法

JavaScript

1const evaluator = new XPathEvaluator(); 2const expression = evaluator.createExpression("//body"); 3const result = expression.evaluate(document, XPathResult.ANY_UNORDERED_NODE_TYPE); 4console.log(result.singleNodeValue);

の2通りがあるようです。

そこで疑問なのですが、document.evaluate()XPathEvaluatorのevaluateXPathExpressionのevaluateはどのように使い分けるのでしょうか。
それぞれの適する場面が知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、仕様上、document.evaluate()XPathEvaluator.evaluate()は全く同じものであるはずです。(Document.createExpression()なども同様)

For historical reasons you can both construct XPathEvaluator and access the same methods on Document.

8.4. Interface XPathEvaluator | DOM Standard

次に、XPathExpression.evaluate()XPathEvaluator.evaluate()の違いですが、これはXPath(と名前空間)をオブジェクトに持たせることができるので、同じ内容で繰り返し実行するときに、コストを下げることができるだろうと思います。

投稿2021/10/23 05:31

Lhankor_Mhy

総合スコア36117

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_kari_

2021/10/23 08:48

ありがとうございます。 仕様書も読んだつもりだったんですが、該当箇所を見事に見落としておりました…調べ物をするときはちゃんと読まないと駄目ですね。 document.evaluate()とXPathEvaluator.evaluate()は動作は仕様上同じはずということですね。 前者のほうがインスタンス生成の手間が要らないので、基本的にそちらを使っておけばよさそうかなと思いました。 検索してもXPathEvaluator.evaluate()を使っているサンプルがほぼ見つからなかったのですが、動作が一緒ならわざわざこちらを使う必要がないので皆document.evaluate()のほうを使うということ…かな?と。 それで、XPathExpressionオブジェクトを生成しておくとXPath式をコンパイルした形(表現が正しいか自信がありませんが…)にしておけるので、何度も同じXPath式でevaluate()する場合は効率がいい、という感じでしょうか。 でもdocument.evaluate()のほうがよく使われているみたいだから、エンジンの最適化を考えるとむしろdocument.evaluate()のほうがパフォーマンスが良かったりして…さすがにそれはないか(素人考えです)
_kari_

2021/10/23 09:00

想像なのですが、documentにもXPathを扱うメソッドがあるのにXPathEvaluatorが別で用意されている理由は、初期のW3Cの仕様のためかなと思いました。 Javaにも同様のXPathEvaluatorがあるらしく、↓の過去質問を思い出したんです。 https://teratail.com/questions/358309 で、おそらくこれが元になったんじゃないかと思います↓ https://www.w3.org/TR/2001/WD-DOM-Level-3-XPath-20010618/Overview.html あくまで想像なので、正しいかはわかりませんが…
Lhankor_Mhy

2021/10/23 09:01

仕様書を見る限りだと、わざわざミックスインXPathEvaluatorBase を作っているぐらいなので、おそらく実装も同一のものだと思います。 あとはもう、Chromium のソースコードとか読むしかないのでは。下記を見た感じ、Document にミックスインしていると思います。 https://source.chromium.org/chromium/chromium/src/+/main:third_party/devtools-frontend/src/node_modules/typescript/lib/lib.dom.d.ts;l=4256?q=XPathEvaluatorBase&ss=chromium
_kari_

2021/10/23 09:13

わざわざすみません…ありがとうございます。 こんな質問をしておいてあれですが、パフォーマンスにシビアな使い方をする予定は今のところないので、あまり深い部分は考えないようにしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問