/
194.txt
201 lines (142 loc) · 11.3 KB
/
194.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
[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>