2007-11-12
JavaScript-XPath をリリースしました!さあ、あなたも XPath を使おう!(解説付き)
JavaScript-XPath とは
JavaScript-XPath は、 DOM 3 XPath を実装していないブラウザに対して、実用的な速度で動作する DOM 3 XPath のエンジンを追加します。
一言で乱暴に言ってしまえば、どのブラウザでも document.evaluate って関数で XPath 使えるようになるよ!ってことです。
以下が公式サイトになります。
http://coderepos.org/share/wiki/JavaScript-XPath
DOM 3 XPath ってなんなの!?
めっちゃ簡単(で、ちょっとだけ適当)なDOM 3 XPath の説明をします><。
JavaScript でよく使う document.getElementById や document.getElementsByTagName って関数ありますよね?
DOM 3 XPath はそれのパワーアップ版の関数 document.evaluate のことです!
わーわー!
どのくらいパワーアップしてるかというと。。。
- document.getElementById では id 属性でしか取得できないけど document.evaluate はどんな属性の値からも要素を取得できます!
- document.getElementsByTagName では要素の名前(タグの名前)でしか取得できなかったけど、 tag が 't' から始まるやつ!とか div か p !とかできます!
- 他にも、 type 属性が text の input 要素を含んでいる form 要素を取得!とかもできます!
すごいでしょ?
でも、この便利な関数って一部のブラウザでしか使えないのです。。そこで、 JavaScript-XPath を使うとすべてのブラウザで DOM 3 XPath が使えるようになるんです。
じゃあ、 document.evaluate には何を渡せばいいの?
ここで、 XPath の登場です!
document.evaluate は以下のように使います!
var result = document.evaluate( '//div', // これが XPath ! document, // どこから取得するか たとえば、 document.body とかってすると head 以下の要素は取得されない null, // 基本使わないと思っていい 7, // 結果の種類を指定する。基本は 6 か 7 でいい。 6 だったら結果がソートされない可能性がある。 null // 基本使わない ); result.snapshotLength; // 取得した要素(正確にはノード)の数。 result.snapshotItem(0); // 1 個目の要素 result.snapshotItem(1); // 2 個目の要素
ね?簡単でしょ?
XPath 覚えなきゃいけねーじゃねーか!
うん><でも、 XPath って超簡単だよ!
超基本的なチートシートだよ。
| 全要素 | //* | /descendant::* | |
| 全 div 要素 | //div | /descendant::div | |
| class 属性が "hoge" な div 要素 | //div[@class="hoge"] | /descendant::div[@class="hoge"] | |
| id 属性が "hoge" な要素 | id("hoge") | //*[@id="hoge"] | /descendant::*[@id="hoge"] |
| title 属性が "hoge" で class 属性が "fuga" でない要素 | //*[@title="hoge" and @class!="fuga"] | /descendant::*[@title="hoge" and @class!="fuga"] | |
| form 要素の 3 番目の input 要素 | //form/descendant::input[3] | /descendant::form/descendant::input[3] | *1 |
| チェックされたチェックボックスの親要素 | //input[@checked="checked"]/.. | //input[@checked="checked"]/parent::node() |
JavaScript-XPath って使うの結構めんどいんでしょ?
違うよ!ぜんぜん違うよ!
超簡単だよ><
という訳で、 JavaScript-XPath を使う為の 3 ステップを教えちゃいます。
1. 最新の JavaScript-XPath をダウンロードしてくる
ここからダウンロードしてね。
2. 以下のように HTML ファイルにインポートする
<!-- こんな感じで javascript-xpath-***.js を読み込む --> <script src="javascript-xpath-latest.js"></script> <!-- ダウンロードがめんどくて、とりあえず使ってみるだけだったら直接参照してみる><(本番環境ではしないでね><) <script src="http://svn.coderepos.org/share/lang/javascript/javascript-xpath/trunk/release/javascript-xpath-latest.js"></script> -->
3. そして、 DOM 3 XPath を使う!
window.onload = function() { // div 要素全部取ってくる var r = document.evaluate('//div', document, null, 7, null); // この '//div' が XPath。これ、まめ知識ね。 // div 要素の数 alert(r.snapshotLength); // 最初の div 要素 alert(r.snapshotItem(0)); // 2 番目の div 要素 alert(r.snapshotItem(1)); };
ほら、できちゃったでしょ?
わいわいがやがや
まとめ
ぜひぜひ、 JavaScript-XPath を使ってください!
この冬も XPath が熱い!
[余談] でも、 JavaScript-XPath にもバグとかあるんじゃないの?
JavaScript-XPath ではある程度のテストはしており、基本的にはバグは少ないと思います。
でも、人が作るものなので、少しのバグはあると思います><
ですので、あなたの力を貸してください!!
JavaScript-XPath では以下のようなテストを行っています
http://svn.coderepos.org/share/lang/javascript/javascript-xpath/trunk/test/functional/index.html
JavaScript-XPath にあなたのテストファイルを提供してください!
ここ にあなたのサイトの HTML と XPath と 結果を書いたテストデータを提供してください><
そうすれば、あなたの XPath がテストに組み込まれ、半永久的にサポートされることでしょう><
テストデータは、 CodeRepos のコミット権を取得すれば誰でも提供する事ができます。
テストデータの形式
テストデータの形式は以下のような形式です。
テストのタイトル -------- <html>HTMLの内容</html> -------- コンテキストノード(キホン的には / だけでいい) -------- XPath => 結果(CSS セレクタのように div.class#id[attributeName="attributeValue"] というような文字列を空白区切りで ) XPath => 結果 XPath => 結果 : :
具体的にはこんな感じのファイルになります。
よろしくお願いします!
- Webアプリを作ろう - 11/12 scrap
- slw/brd-s on htn_00oo00_ - http://d.hatena.ne.jp/amachang/20071...
- Greasemonkeyの移植
- [Django][Python][jQuery][CSS][その他]巡回
- [JavaScript][Program]Sleipnir 版 livedoor Reader で全文配信
- JavaScript-XPath
- kinneko@転職先募集中の日記 - JavaScript-XPath
- Sybianの日記 - 自分管理のHTMLでXPathを活用する
- niso1985の日記 - XPath
- 365日誓約マラソン - sbm count with googleを読む
- 365日誓約マラソン - sbm count with googleを読む
- 365日誓約マラソン - sbm count with googleを読む
- [php][xml] XPathでGoogleの検索結果数を抽出する
- どんならんな - [日記]
- [51]注目!パソコンの使い方-はてなダイアリー - はてなダイアリー...
- Haruka1976の日記
- jQuery メモ帳 - XPATH って なんですか
- 晴耕雨読 - web design 覚ゑ画記
- JavaScript-XPath を jQuery で
- 新みのる日記 -
- Twitter に Google Maps へのリンクを追加するグリモン
- AutoPagerlike: Sleipnir+SeaHorse版 AutoPagerize(もどき)
- uupaaの開発日記 - XPathは正規表現のDOM版です。
- Yin and Yang:リンク先の内容をその場で表示するスクリプト(Grease...
- 山本大@クロノスの日記 - オレンジニュース風 後で読むサイト放出
- ウィクリーえがちゃん - 1201997518*ネタ
- Xpathでページの好きなところにリンクするGreasemonkeyスクリプト
- “なかのひと”の解析結果をExcelで使えるようにする便利ブックマー...
- 風柳メモ - はてなニュースをキー操作でさくさく読むスクリプト
- Cli@ - JavaScript-XPath をリリースしました!さあ、あなたも XPat...
- これはえがい開発日記@サブブログ - やりたいネタ(2009/01/03に新...
- ぬるま湯に浸かりながら - xpath4jquery.jsをjquery-1.3.jsで動かす
- Pastalablog in はてな - XPathについて01
- Greasemonky(javascript) - 広告の削除に役立つ関数
- 風柳メモ - Google App EngineでもXPathを使いたい!
- 風柳メモ - Google App EngineでもXPathが使える!XPathEvaluator E...
- document.evaluate の評価って一回きり?
- 主に言語とシステム開発に関して - Selenium 中級者になろう (変...
- Wisteria::Diary - WSH で HTML を XPath したいんじゃあああぁぁ
- 世界を泳ぐ1bit - やる気になったら即実行
- ?D of K - 日本のJavaScript界隈のブログを適当かつ詳細にまとめて...
- 大人になったら肺呼吸 - Greasemonkey開発になくてはならないほど便...
- s_hiiragiの活動メモ - XPath調査結果
- 言語ゲーム (山宮隆の日記) - Safari で XPath
- メメメモモ - XPathメモ
- 風柳メモ - ページング(他ページを読み込んで継ぎ足す)スクリプトを...
- gae+eyoの日記 - LDRoidいじり
- M59の記録 - BRリムーバー
- catmoneyの日記 - youtubeの連続再生機能追加(プロトタイプ)
- takutism - prototype.jsを読もうとしてみたけれど
- 439 http://b.hatena.ne.jp/
- 423 http://www.hatena.ne.jp/
- 353 http://b.hatena.ne.jp/hotentry
- 299 http://reader.livedoor.com/reader/
- 205 http://d.hatena.ne.jp/
- 168 http://www.google.co.jp/ig?hl=ja
- 115 http://b.hatena.ne.jp/add?mode=confirm&title=JavaScript-XPath %u3092%u30EA%u30EA%u30FC%u30B9%u3057%u307E%u3057%u305F%uFF01%u3055%u3042%u3001%u3042%u306A%u305F%u3082 XPath %u3092%u4F7F%u304A%u3046%uFF01%uFF08%u89E3%u8AAC%u4ED8%u304D%uFF09 - IT%u6
- 111 http://del.icio.us/
- 81 http://www.google.com/reader/view/
- 79 http://popurls.com/
