javascriptでXPathを使いたいと思っています。


「HTMLをクリックするとその部分のXPath文を取得できる」
(ex)/html/body/div[2]/p[3] などの文が取得したい

ということがしたいのですが、検索で探しても指定したXPath文からどうやってHTMLの要素を取得するかということばかりで、
XPath文自体の生成についてはなく、困っています。

FireFoxのextentionでxpatherというものがあるのですが、これに近いと思います。
https://addons.mozilla.org/ja/firefox/addon/xpather/

ブラウザは、Webkit系のchromeとsafariで動作すればIEなどは対象外でも構いません。

どうぞよろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/05/06 14:24:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント35pt

取得というか、単にDOMを辿ってXPATHを再構築すればよいかと。

例示されたような形式(タグ名のみ表示、兄弟タグが無ければインデックスは省略、兄弟タグがあればインデックス付き)でしたら以下のような関数でどうでしょう。

function getXpath(element) {
  if(element && element.nodeType == document.ELEMENT_NODE) {
    var xpath = arguments.callee(element.parentNode) + '/' + element.tagName;
    var siblings = [];
    for(var i = 0; i < element.parentNode.childNodes.length; i++) {
      var e = element.parentNode.childNodes[i];
      if(e.nodeType == document.ELEMENT_NODE && e.tagName == element.tagName) {
        siblings.push(e);
      }
    }
    if(1 < siblings.length) {
      for(var i = 0; i < siblings.length; i++) {
        if(siblings[i] === element) {
          xpath += '[' + (i+1) + ']';
          break;
        }
      }
    }
    return xpath.toLowerCase();
  }
  return '';
}

デモページ

id:gomasa

どうもありがとうございます!

まさにやりたいことでした。

2011/05/06 14:23:53
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント35pt

>「HTMLをクリックするとその部分のXPath文を取得できる」

 

まずはクリックイベントを拾って、クリックされた座標を得る必要があります

下記など参照してみてください

http://www.red.oit-net.jp/tatsuya/java/popmenu.htm

http://d.hatena.ne.jp/uupaa/20100401/1270097629

 

座標を得ることが出来たならばelementFromPointで「その部分」の要素を得られるようになります

http://www.openspc2.org/reibun/javascript2/DOM/element/0001/inde...

 

最後に document.evaluate の第二引数を document(文書全体) から elementFromPoint(その部分)に替えます

https://developer.mozilla.org/ja/Introduction_to_using_XPath_in_...

id:gomasa

こちらもとても勉強になりました!

ありがとうございます。

2011/05/06 14:24:18
  • id:y-kawaz
    デモページがFirefoxで動いてなかったので直しました。回答と関係ない部分のバグなので回答のgetXpath関数はそのままです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません