如何获取X / HTML文件中元素的xpath

时间:2012-02-08 16:56:46

标签: javascript xpath

我是Xpath的初学者,想知道是否有办法在javascript / jquery中获取元素的xpath。我需要一种绝对的方法来识别一个元素,我知道Xpath用于此,但无法弄清楚如何。

场景是我有一个元素的jquery引用。我想让它的xpath在鼠标点击时存储在数据库中。 如果有jquery引用,如何获取HTML元素的Xpath。我需要能够稍后将Xpath转换为绝对元素

function clickTrack(event){
offset=event.pageX;
var xpath=getXpath(this);//I need the xpath here
data={'xpath':xpath,'offset':offset};

}

4 个答案:

答案 0 :(得分:7)

您可以从我曾写过的XPath工具中提取此功能:

http://webkitchen.cz/lab/opera/xpath-tool/xpath-tool.js


编辑:你走了:

function getXPath(node) {
    var comp, comps = [];
    var parent = null;
    var xpath = '';
    var getPos = function(node) {
        var position = 1, curNode;
        if (node.nodeType == Node.ATTRIBUTE_NODE) {
            return null;
        }
        for (curNode = node.previousSibling; curNode; curNode = curNode.previousSibling) {
            if (curNode.nodeName == node.nodeName) {
                ++position;
            }
        }
        return position;
     }

    if (node instanceof Document) {
        return '/';
    }

    for (; node && !(node instanceof Document); node = node.nodeType == Node.ATTRIBUTE_NODE ? node.ownerElement : node.parentNode) {
        comp = comps[comps.length] = {};
        switch (node.nodeType) {
            case Node.TEXT_NODE:
                comp.name = 'text()';
                break;
            case Node.ATTRIBUTE_NODE:
                comp.name = '@' + node.nodeName;
                break;
            case Node.PROCESSING_INSTRUCTION_NODE:
                comp.name = 'processing-instruction()';
                break;
            case Node.COMMENT_NODE:
                comp.name = 'comment()';
                break;
            case Node.ELEMENT_NODE:
                comp.name = node.nodeName;
                break;
        }
        comp.position = getPos(node);
    }

    for (var i = comps.length - 1; i >= 0; i--) {
        comp = comps[i];
        xpath += '/' + comp.name;
        if (comp.position != null) {
            xpath += '[' + comp.position + ']';
        }
    }

    return xpath;

}

如果您希望它也能在IE中运行,可能需要进行一些更改。

答案 1 :(得分:3)

没有“元素”的“XPath”。

当人们提出这个问题时,他们通常会想要三件事之一:

(a)元素祖先中元素的名称,例如/ a / b / c / d

(b)如(a)但添加了位置信息,例如/ a [2] / b [3] / c [1] / d [4]。 (一种变体是只想要位置信息而不是还原剂)

(c)as(b)但没有名称空间依赖关系,例如/ [namespace-uri()='x'和local-name()='y'] [1] / [namespace-uri()='x'和local-name ='z'] [5] / ...

这三个都很容易用任何语言构建一个简单的递归函数。

答案 2 :(得分:3)

您可以使用https://github.com/bermi/element-xpath

上的Github库来解决这个问题
  1. 包含脚本

      <script src="https://raw.github.com/bermi/element-xpath/master/element-xpath.min.js" type="text/javascript"></script>
    
    1. 使用此代码

       document.body.addEventListener("click", function (ev) {
           console.log(ev);
           console.log(ev.toElement);
      
           var xpath = getElementXpath(ev.toElement);
           console.log(xpath);
      });
      

答案 3 :(得分:1)

需要更多信息,但如果你有一个元素的ID很容易。例如,如果您的jquery引用正在抓取id =“myDiv”的div,那么合适的xpath将是

//div[@id="myDiv"]

这是一个xpath教程:http://www.tizag.com/xmlTutorial/xpathtutorial.php

一个很好的参考:https://developer.mozilla.org/en/XPath

编辑:我看到你只想要给出节点的绝对xpath。在这种情况下,我相信您必须使用parentNodereference here)向后移动DOM树来构建xpath。您还需要做一些工作来检查每个节点基于标签名称的子编号。还要记住,在xpath中,索引以规范(reference here)从1开始,而不是0。

编辑#2:请参阅此post中的getPathTo()。它不会一直向上移动,但它会获得相对于兄弟姐妹的位置。此外,还有一个不可接受的答案是对绝对路径here的全面尝试。