当前位置: 首页 > 知识库问答 >
问题:

如何获取元素的xPath,并再次从xPath中检索元素

孔冥夜
2023-03-14

我正在尝试创建一个用户可以在浏览器中存储注释的应用程序。

为了弄清楚用户在文档中创建注释的位置,我正在尝试存储所选文本的xpath和偏移量。

我到处搜索过,似乎有很多从xPath字符串中检索元素的示例,但没有很好的从DOM元素中查找xPath的示例。

以下是我尝试过的:

//Find xPath and pass the object
var range_obj = {
  start: getXPathForElement(range.startContainer, range.startContainer.ownerDocument),
  end: getXPathForElement(range.endContainer, range.endContainer.ownerDocument),
  startOffset: range.startOffset,
  endOffset: range.endOffset
};

其中getXPathForElement如下所示:

function getXPathForElement(el, xml) {
  var xpath = '';
  var pos, tempitem2;

  while (el !== xml.documentElement) {
    pos = 0;
    tempitem2 = el;
    while (tempitem2) {
      if (tempitem2.nodeType === 1 && tempitem2.nodeName === el.nodeName) { // If it is ELEMENT_NODE of the same name
        pos += 1;
      }
      tempitem2 = tempitem2.previousSibling;
    }

    xpath = "*[name()='" + el.nodeName + "' and namespace-uri()='" + (el.namespaceURI === null ? '' : el.namespaceURI) + "'][" + pos + ']' + '/' + xpath;

    el = el.parentNode;
  }
  xpath = '/*' + "[name()='" + xml.documentElement.nodeName + "' and namespace-uri()='" + (el.namespaceURI === null ? '' : el.namespaceURI) + "']" + '/' + xpath;
  xpath = xpath.replace(/\/$/, '');
  return xpath;
}

这段代码给出了一个很长的看起来很奇怪的文本,如下所示:(我认为这不是一个真正正确的xPath)。

"/[name()='超文本标记语言'and namespace-uri()='http://www.w3.org/1999/xhtml']/[name()='BODY'and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/[name()='P'and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/[name()='SPAN'and namespace-uri()='http://www.w3.org/1999/xhtml'][4]/[name()='SPAN'and namespace-uri()='http://www.w3.org/1999/xhtml'][2]/[name()='#text'and namespace-uri()='un定义'][0]"

但在Chrome Inspect Element中,它提供了如下干净字符串:

//*[@id=“tinymce”]/p/span[2]/span[2]/strong

有人能帮我从文档中检索元素的xpath,然后稍后从xpath中找到该元素吗?

共有1个答案

戎元忠
2023-03-14

如果您能够使用Saxon JS,那么就可以使用XPath 3.0函数fn:path(),该函数专门为此目的而设计

 类似资料:
  • 问题内容: 我有具有特定名称的元素的NodeList,我想拥有所有theese节点的XPath。 我找不到方法。 我正在寻找类似GET_XPATH()的方法 有人知道该怎么做吗?甚至有可能吗? 如果可能,XSLT也可以使用它,但是如果有人知道Java中的这种可能性,则最好使用它。 原因:我需要一组指向XML库的指针。指向定义元素的指针。 输入示例: 输出: 问题答案: 以下样式表: XSLT 1.

  • 嗨,我一直在到处寻找一个非常简单的解释,如何通过xPath找到一个元素。 我想要的只是一种简单的方法来寻找一个元素,但是我想要找到的所有帮助都需要一个。这对我不管用。以下是我想做的: 加载URL 这是我的代码: 当我执行 我得到未定义时,我做 有没有更简单的方法来获取元素?也许是。。。。

  • 我能把1打印出来吗? 我尝试了以下: 它返回给我一个错误: 给定的选择器。//[@id='version id']/tbody/tr/td[2]/span/text()无效或不会导致webelement。出现以下错误:InvalidSelectorError:xpath表达式“.//[@id='version id']/tbody/tr/td[2]/span/Text()”的结果是:[object

  • 我正在使用Selenium(Java版本)测试一个基于OpenLayers的API。 我想测试一个使用的功能。控制修改功能。我想单击绘制的特征(SVG),然后拖动并检查它们是否存在、可见或隐藏。 我已经画了一个多边形,并且选择了它。见下图: 这些SVG元素的HTML如下所示: 假设我想选择红点。 我试过: 但是它总是返回一个空列表。 我做错了什么?有人能帮我吗? 多谢了。 编辑1-功能:垂直显示可

  • 我正在尝试获取此代码的颜色和图像: 除了在以电流结尾的类中,这两个看起来都一样。 我的问题是我不知道如何获得元素的值。 我试过:

  • 我试图通过iframe中的id获取“Form”元素的xpath。 在chrome xpath插件中进行查询 //iframe[包含(@id,'fraModalPopup')] 它获取iframe,但当我尝试从层次结构中获取任何内容时,它只返回null。e、 g.如果我尝试 //iframe[包含(@id,'fraModalPopup')]/html//返回null 或 //iframe[包含(@i