LoginSignup
14
14

More than 5 years have passed since last update.

DOM ElementからのXPath取得関数を作ってみた

Posted at

Firebugの"XPathをコピー"と互換性があります。
いわゆるこれ↓
これ.png

要素を右クリックして、"XPathをコピー"した場合と同じ文字列を取得できます。

実装

/**
 * エレメントノードからxpathを構築します。
 *
 * @param   Node    element_node    xpath構築元のelement node
 * @returns element nodeまでのxpath
 */
function getXpathByElementNode (element_node) {
    var NODE_TYPE_ELEMENT_NODE = 1;

    if (element_node instanceof Array) {
        element_node = element_node[0];
    }

    if (element_node.nodeType != NODE_TYPE_ELEMENT_NODE) {
        throw new ErrorException('nodes other than the element node was passed. node_type:'+ element_node.nodeType +' node_name:'+ element_node.nodeName);
    }

    var stacker = [];
    var node_name = '';
    var node_count = 0;
    var node_point = null;

    do {
        node_name = element_node.nodeName.toLowerCase();
        if (element_node.parentNode.children.length > 1) {
            node_count = 0;
            node_point = null;
            for (i = 0;i < element_node.parentNode.children.length;i++) {
                if (element_node.nodeName == element_node.parentNode.children[i].nodeName) {
                    node_count++;
                    if (element_node == element_node.parentNode.children[i]) {
                        node_point = node_count;
                    }
                    if (node_point != null && node_count > 1) {
                        node_name += '['+ node_point +']';
                        break;
                    }
                }
            }
        }
        stacker.unshift(node_name);
    } while ((element_node = element_node.parentNode) != null && element_node.nodeName != '#document');

    return '/' + stacker.join('/').toLowerCase();
}

実証

PHP - mb_strwidthの返す値が怪しかったので調べてみた - QiitaのHTMLを対象に検証。

元のXPathを取得

画面上での指定は次の画像の通り。

03.png

Firebugでの指定では次の画像の通り。

02.png

この状態で"XPathをコピー"すると次の結果が得られる。

/html/body/div[3]/article/div[2]/div/div[1]/section/table[1]/tbody/tr[3]/td[2]

XPathからエレメントを取得し、エレメントからXPathを取得する

Firebugのコンソールを使う

04.png

関数追加して処理を実行して・・・

05.png

/html/body/div[3]/article/div[2]/div/div[1]/section/table[1]/tbody/tr[3]/td[2]

同じ結果を得る事が出来た。

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14