[43] [DFN[[[DOM XPath]]]] は、 [[XPath 1.0]] を使って[[DOM木]]上の[[節点]]を取得する
[[API]] です。

[44] 現行のすべての主要 [[Webブラウザー]]に実装されています。かつてはよく用いられていましたが、
異様に複雑な [[API]] のため、 [[Selectors API]] が実装されてからはほとんど使うこともなくなりました。

* 代替

[46] [[Selectors API]] と通常の [[DOM API]] でほとんど代用できます。

* 仕様書

[REFS[
- [41] [CITE@en[DOM XPath - WHATWG Wiki]] ([TIME[2014-10-23 08:39:56 +09:00]] 版) <https://wiki.whatwg.org/wiki/DOM_XPath>
]REFS]

[42] [[DOM3 XPath]] が10年以上メンテナンスされておらず、事実上標準不在状態となっています。

* 歴史

** MSXML XPath

- [20] [CODE(DOMm)@en[[[selectNodes]]]]
- [21] [CODE(DOMm)@en[[[selectSingleNode]]]]

[15] [CITE[IRC logs: freenode / #whatwg / 20101008]]
( ([TIME[2010-10-22 22:12:03 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20101008#l-419>

** DOM3 XPath

- [24] [CODE(DOMi)@en[[[XPathNSResolver]]]]

[1]
[CITE[Introduction to using XPath in JavaScript - MDC]] <http://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript>
([[名無しさん]])

[2]
[CITE[Latest topics > getElementsByなんちゃら の代わりにXPathを使う - outsider reflex]] ([[Piro(SHIMODA Hiroshi)]] 著, [CODE[2007-09-09 11:44:24 +09:00]] 版) <http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2007-09-09_xpath.htm>
([[名無しさん]])

[3]
[CITE@en[SourceForge.net: XPath over HTML for MSIE]] ([CODE[2007-10-06 15:19:21 +09:00]] 版) <http://sourceforge.net/projects/html-xpath/>
([[名無しさん]])

[4]
[CITE@ja[Safari 3 の XPath のバグ: Days on the Moon]] ([CODE[2008-05-11 15:36:16 +09:00]] 版) <http://nanto.asablo.jp/blog/2007/11/10/1901281>
([[名無しさん]])

[5]
[CITE@ja[選択範囲のリンクを取得する: Days on the Moon]] ([CODE[2008-10-19 11:34:21 +09:00]] 版) <http://nanto.asablo.jp/blog/2008/10/18/3829312>
([[名無しさん]])

[6]
[CITE[XPath は実用に耐えうるかの考察と xpath.js - IT戦記]] ([CODE[2008-10-31 22:50:48 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20070828/1188306956>
([[名無しさん]])


[7]
[CITE[HTML 用の XPath 機能テストを書いた - IT戦記]] ([TIME[2008-10-31 23:00:27 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20071009/1191903856>

[8] [CITE[JavaScript-XPath をリリースしました!さあ、あなたも XPath を使おう!(解説付き) - IT戦記]] ([TIME[2009-02-02 02:01:53 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20071112/1194856493>

[9] [CITE[JavaScript-XPath – CodeRepos::Share – Trac]] ([TIME[2009-02-02 11:11:12 +09:00]] 版) <http://coderepos.org/share/wiki/JavaScript-XPath>

[10] [CITE[はてなブックマークのコンテンツの JavaScript を高速化する - IT戦記]] ([TIME[2009-02-08 18:51:12 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20081126/1227700830>

[11] [CITE@ja[XPath, $X function, NSResolver < 16 < March < 2006 < nulog, NULL::something : out of the headphone]] ([TIME[2009-02-01 19:18:32 +09:00]] 版) <http://lowreal.net/logs/2006/03/16/1>

[12] [CITE@ja[Kanasan.JS Greasemonkey チュートリアル読書会: Days on the Moon]] ([TIME[2009-03-23 00:03:31 +09:00]] 版) <http://nanto.asablo.jp/blog/2009/03/22/4197758>

>document.evaluate メソッドの返り値である XPathResult オブジェクトを、別の evaluate メソッドの呼び出し時に第5引数として渡すと、その XPathResult オブジェクトが再利用されます。しかし、「再利用される」とは具体的にどうなることかという説明は DOM 3 XPath 仕様中になく、そもそも "'''may''' be reused" (強調は筆者による) なので確実に再利用されるという保証もありません。Firefox (Gecko) と Opera では第 5 引数に渡したオブジェクトが返り値となりますが、Safari (WebKit) では常に新しいオブジェクトを生成して返すようです。ちなみに Firefox では第 5 引数を指定すると意図しない結果になることがあります。
>
[PRE(JS example code)[
var result = document.evaluate("'foo'", document, null,
                               XPathResult.STRING_TYPE, null);
document.evaluate("'bar'", document, null,
                  XPathResult.STRING_TYPE, result);
result.stringValue;
// Firefox 3.6a1pre => "foobar" ("bar" を期待していたのに!)
// Opera 9.64       => "bar"
// Safari 3.1.2     => "foo"
]PRE]

>
XPathResult には結果の型として順序付きのもの (ORDERED_NODE_ITERATOR_TYPE、ORDERED_NODE_SNAPSHOT_TYPE、FIRST_ORDERED_NODE_TYPE) と順序なしのもの (UNORDERED_NODE_ITERATOR_TYPE、UNORDERED_NODE_SNAPSHOT_TYPE、ANY_UNORDERED_NODE_TYPE) があります。ソースコードを見る限り、WebKit では順序付きかどうかで処理を分けていますが、Gecko では順序なしでも順序付きと同等に扱っているようです。

[16] [CITE@en[DOM XPath - WHATWG Wiki]]
( ([TIME[2012-04-10 18:16:04 +09:00]] 版))
<http://wiki.whatwg.org/wiki/DOM_XPath>

[17] [CITE@en-US[Document Object Model (DOM) Level 3 XPath Specification]]
( ([TIME[2004-02-23 21:49:04 +09:00]] 版))
<http://www.w3.org/TR/DOM-Level-3-XPath/>

[18] [CITE@en-US[Document Object Model (DOM) Level 3 XPath Specification]]
( ([TIME[2004-02-23 21:49:04 +09:00]] 版))
<http://www.w3.org/TR/2004/NOTE-DOM-Level-3-XPath-20040226/DOM3-XPath.html>

[19] [CITE@en-US[Document Object Model (DOM) Requirements]]
( ([TIME[2004-02-23 21:14:24 +09:00]] 版))
<http://www.w3.org/TR/2004/NOTE-DOM-Requirements-20040226/#dom-level-3-requirements-level3-xpath>

[23] [[Firefox]] は [CODE(JS)@en[[[document.evaluate]]]] の引数を省略できません。
[[Chrome]] では最初の2つ以外は省略できます。 [TIME[2013-09-25T13:45:03.600Z]]

[35] [[Firefox]] は最後の引数が[[オブジェクト]]でなく[[プリミティブ値]]だと例外を投げます。
[[Chrome]] では例外になりません。 [TIME[2013-10-07T14:40:41.500Z]]

[30] [CITE[Introduction to DOM XPath - DOM ECMAScripting]]
( ([TIME[2012-02-18 20:10:31 +09:00]] 版))
<http://domes.lingua.heliohost.org/dom/intro-xpath1.html>

[31] [[Firefox]] でも [[Chrome]] でも[[文脈節点]]を [CODE(DOMi)@en[[[DocumentFragment]]]]
にすると [CODE(DOM)@en[[[NotSupportedError]]]] [[例外]]を投げます。 [TIME[2013-09-30T00:06:57.400Z]]

[36] [[Chrome]] では構文解析時でない評価時のエラーは [CODE[[[SyntaxError]]]] にします。
[[Firefox]] は [[DOMException]] ではなさそうな謎のエラーにします。 [TIME[2013-10-07T14:51:21.800Z]]

** XPath と HTML

[13] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-29 08:53:48 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4006&to=4007>

[14] [CITE[Bug 7059 – Forking XPath]]
([TIME[2009-09-29 08:57:42 +09:00]] 版)
<http://www.w3.org/Bugs/Public/show_bug.cgi?id=7059>

[22] [[Firefox]] も [[Chrome]] も、[[既定名前空間]]については [CODE(DOMi)@en[[[NSResolver]]]] 
を呼び出しません (仕様通りの動作)。 [[HTML文書]]では[[既定名前空間]]の[[名前テスト]]は[[HTML名前空間]]の[[要素]]と[[一致]]します。
[[Firefox]] では更に [[null名前空間]]の[[要素]]とも[[一致]]します。 [[XML文書]]では [[Firefox]]
も [[Chrome]] も[[null名前空間]]の[[要素]]とだけ[[一致]]します。どちらの場合もその他の[[名前空間]]とは[[一致]]しません。
[TIME[2013-09-25T13:37:24.800Z]]

** 構文解析

[26] [CODE(DOMi)@en[[[XPathNSResolver]]]] の項も参照。

[25] [[Firefox]] は[[関数名]]の[[名前空間接頭辞]]を[[解決]]した上で、未対応の[[関数]]があれば構文解析エラーとします。
[[Chrome]] は[[関数]]の[[名前空間接頭辞]]を[[解決]]せず、未対応の[[関数]]があれば構文解析エラーとします。 [TIME[2013-09-28T12:41:21.100Z]]

[28] [[Firefox]] は[[関数]]の[[引数]]の個数チェックを[[評価]]時に行っているようですが、
[[Chrome]] は[[構文解析]]時に行っているようです。 [TIME[2013-09-28T13:10:47.700Z]]

[29] [[Firefox]] も [[Chrome]] も[[引数]]の型チェックは[[構文解析]]時ではなく[[評価]]時に行っているようです。
例えば [CODE[count(12)]] は構文解析エラーになりませんが評価時に例外が投げられます。
[CODE[[[|]]]] [[演算子]]も同様です。 [TIME[2013-09-29T02:02:23.100Z]]

[27] [[Firefox]] は[[変数]]が入った[[式]]を構文解析できますが、評価時に [CODE[[[NS_ERROR_ILLEGAL_VALUE]]]]
[[例外]]が発生します。なので [CODE(DOMm)@en[[[createExpression]]]] は成功しますが
[CODE(JS)@en[[[document.evaluate]]]] は[[例外]]を投げます。
[[Chrome]] は[[変数]]に[[名前空間接頭辞]]があると [CODE(DOM)@en[[[SyntaxError]]]]
になります。[[名前空間接頭辞]]がなければ[[評価]]も成功します ([[空文字列]]になるようです)。 [TIME[2013-09-28T12:46:45.400Z]]


[32] [CITE@en-US[Document Object Model (DOM) Requirements]]
( ([TIME[2004-02-23 21:14:24 +09:00]] 版))
<http://www.w3.org/TR/2004/NOTE-DOM-Requirements-20040226/#dom-level-3-requirements-level3-xpath>

[33] [CITE@en-US[Introduction to using XPath in JavaScript | MDN]]
( ([TIME[2013-10-01 05:45:01 +09:00]] 版))
<https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript>

[34] [CITE@en-AU[XPath 1.0 in JavaScript • Cameron McCormack's blog]]
( ([TIME[2013-10-05 02:43:05 +09:00]] 版))
<http://mcc.id.au/xpathjs>

[37] [CITE@en[DOM Level 3 XPath Test Suite]]
( ([TIME[2003-02-19 20:32:43 +09:00]] 版))
<http://www.w3.org/2003/02/19-dom-xpath-implementation.html>

[38] [[Firefox]] は [CODE(DOMm)@en[[[evaluate]]]] [[メソッド]]の[[文脈オブジェクト]]たる
[CODE(DOMi)@en[[[Document]]]] と[[文脈節点]]として指定した[[節点]]の[[文書]]が異なると
[CODE(DOMe)@en[[[WRONG_DOCUMENT_ERR]]]] を投げるようです ([[DOM3 XPath]] 仕様に従った動作)。
[[Chrome]] は例外を投げずに処理を続けます。 [TIME[2013-10-12T07:10:36.900Z]]

[39] [CITE@en[376740 – XPath expressions in HTML must be lowercase]]
( ([TIME[2013-11-01 00:03:10 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=376740>

[40] >>39 [[Chrome]] は [[HTML]] の[[要素]]の大文字と小文字を区別しないようですが [[Firefox]]
は区別します。 [TIME[2013-11-01T00:05:59.100Z]]

[FIG(quote)[
[FIGCAPTION[
[45] [CITE[IRC logs: freenode / #whatwg / 20150903]]
([TIME[2015-09-04 17:43:24 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150903>
]FIGCAPTION]

> 
> # '''['''04:43''']''' <Domenic> https://www.chromestatus.com/metrics/feature/timeline/popularity/297 https://www.chromestatus.com/metrics/feature/timeline/popularity/295 https://www.chromestatus.com/metrics/feature/timeline/popularity/296 usage stats... could in theory remove createExpression?
> # '''['''04:44''']''' <Domenic> Which would be nice because then we could kill XPathExpression entirely

]FIG]


[47] [CITE@en[find: Correct implementation of "xpath" strategy]]
([[jugglinmike]]著, [TIME[2017-06-06 04:07:53 +09:00]])
<https://github.com/w3c/webdriver/commit/bbcbfbad1568296d84e75bc3edf5a7db311c58b1>

[48] [CITE@en[domxpath/interfaces.html has no spec to back it up · Issue #7562 · w3c/web-platform-tests]]
([TIME[2017-12-23 15:45:51 +09:00]])
<https://github.com/w3c/web-platform-tests/issues/7562>

[49] [CITE@en[Make the XPath IDL tests tentative by foolip · Pull Request #7639 · w3c/web-platform-tests]]
([TIME[2017-12-23 15:46:07 +09:00]])
<https://github.com/w3c/web-platform-tests/pull/7639>

[50] [CITE@en[Add the DOM XPath interfaces from the WHATWG wiki]]
([[annevk]]著, [TIME[2019-08-30 17:38:53 +09:00]])
<https://github.com/whatwg/dom/commit/dea5d92156f144faf57d1a5e54a17227139ca3c5>

[51] [CITE@en[Copy the DOM XPath interfaces from the WHATWG wiki by foolip · Pull Request #763 · whatwg/dom]]
([TIME[2020-07-14 15:20:13 +09:00]])
<https://github.com/whatwg/dom/pull/763>

[52] [CITE@en[Consider specifying document.evaluate and document.createNSResolver · Issue #67 · whatwg/dom]]
([TIME[2020-07-14 15:21:50 +09:00]])
<https://github.com/whatwg/dom/issues/67>