【问题标题】:relative xpath to absolute xpath with javascript使用javascript的相对xpath到绝对xpath
【发布时间】:2016-07-19 04:16:13
【问题描述】:

在给定 dom 节点的相对路径的情况下,是否可以使用 javascript 获取绝对 xpath?

我发现的最接近的是获取节点的 xpath:Get Xpath from the org.w3c.dom.Node

此外,我获得了没有唯一标识符的节点的相对 xpath。任何想法如何解决这个问题?

例如,对于:

 <p>DUKE SOLINUS</p>
 <div>
 <p>AEGEON</p> 
 </div>

对于选定的单词“DUKE”和“AEGEON”,我分别得到xpaths“/p[1]”和“/div[1]/p[1]”,当它们传递给document.evaluate函数时两者都评估为同一节点“DUKE SOLINUS”。所以,我只有这些相对的 xpath,没有节点。我想要的是评估这些相对 xpath 以纠正节点,即本例中的两个不同节点(DUKE SOLINUS 和 AEGEON)。

更具体地说,xpaths 取自 json 注释对象:http://docs.annotatorjs.org/en/v1.2.x/annotation-format.html

任何帮助将不胜感激! 非常感谢!

【问题讨论】:

  • 这可能是其中一个问题,无论您想出什么优雅的答案,我都可以构建一个失败的场景。为每个节点分配 ID 是可行的,但这很糟糕。为什么你仍然需要绝对 xpath?也许有一个你没有的解决方案。
  • 非常感谢您的回答!我害怕听到这个,但我仍然希望会有一个答案。我在页面上有一个选定文本的相对路径(我也有那个文本 - 不是特别有用),我需要用其他一些文本替换那个文本。由于我得到的相对路径并不总是唯一的(我将使用示例更新我的问题),document.evaluate 函数将评估为同一个节点。

标签: javascript dom xpath


【解决方案1】:

这个函数会找到一个给定节点的cardinal绝对xpath。如果任何节点的顺序发生变化,或者节点被添加或删除,那么这将不起作用。但是对于静态内容应该没问题。

function getXpathOfNode(domNode,bits) {
  // uses cardinality.  Will not work if any nodes are added/moved/removed in the DOM.  Fine for static stuff.
  bits = bits ? bits : [];
  var c = 0;
  var b = domNode.nodeName;
  var p = domNode.parentNode;

  if (p) {
    var els = p.getElementsByTagName(b);
    if (els.length >  1) {
      while (els[c] !== domNode) c++;
      b += "[" + (c+1) + "]";
    }
    bits.push(b);
    return getXpathOfNode(p, bits);
  }
  
  //bits.push(b);  // this is #document.  Probably dont need it.
  return bits.reverse().join("/");
}
// testing
var xp = getXpathOfNode(document.getElementById("pickme"));
var r = document.getElementById("result");
r.innerHTML = "the xpath is " + xp + "<br>";
var result =  document.evaluate(xp, document, null, XPathResult.ANY_TYPE, null);
r.innerHTML += "the chosen node contains - " + result.iterateNext().innerHTML;
<div>
<div>junk</div>
<span>irrelevant</span>
<div>pointless
<div>
<div id="pickme">this is the test node</div><span>don't read this</span></div>
<br><br>
<div id="result"></div>
</div>

【讨论】:

  • 非常感谢,但现在我不确定我是否正确解释了我需要什么(我再次更新了问题:))。您建议的函数接受一个节点,然后计算出它的 xpath。我需要的是在只有相对 xpath 时获取节点。 document.evaluate 不会总是返回一个唯一的节点(例如在给定的示例中)。这就是为什么我认为从给定的相对路径获取绝对 xpaths 然后使用 document.evaluate 可能更容易。
  • 你有与你的 xpath 相关的节点吗?如果是&lt;div id='content'&gt; 你可以document.evaluate(relativeXpath, document.getElementById('content'), ...
  • 我不确定我是否能得到它,但我会检查一下。感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2017-08-17
相关资源
最近更新 更多