使用javascript实现相对xpath到绝对xpath

使用javascript实现相对xpath到绝对xpath,javascript,dom,xpath,Javascript,Dom,Xpath,如果给定dom节点的相对xpath,是否可以使用javascript获得绝对xpath 我找到的最接近的方法是获取节点的xpath: 此外,我得到了没有唯一标识符的节点的相对XPath。有没有办法解决这个问题 例如: <p>DUKE SOLINUS</p> <div> <p>AEGEON</p> </div> 杜克·索里努斯 爱琴海 对于选定的单词“DUKE”和“AEGEON”,我分别得到xpath“/p[1]

如果给定dom节点的相对xpath,是否可以使用javascript获得绝对xpath

我找到的最接近的方法是获取节点的xpath:

此外,我得到了没有唯一标识符的节点的相对XPath。有没有办法解决这个问题

例如:

 <p>DUKE SOLINUS</p>
 <div>
 <p>AEGEON</p> 
 </div>
杜克·索里努斯

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

更具体地说,XPath取自json注释对象:

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

此函数将查找到给定节点的基数绝对xpath。如果任何节点的顺序发生更改,或者节点被添加或删除,则此操作将不起作用。但对于静态内容,它应该是好的

函数getXpathOfNode(domNode,位){ //使用基数。如果在DOM中添加/移动/删除任何节点,则不起作用。适用于静态内容。 位=位?位:[]; var c=0; var b=domNode.nodeName; var p=domNode.parentNode; 如果(p){ var els=p.getElementsByTagName(b); 如果(els.length>1){ 同时(ELS [C]!= = DMONNORT)C++; b+=“[”+(c+1)+“]”; } 位推送(b); 返回getXpathOfNode(p,位); } //bits.push(b);//这是#文档。可能不需要它。 返回bits.reverse().join(“/”); } //测试 var xp=getXpathOfNode(document.getElementById(“pickme”); var r=document.getElementById(“结果”); r、 innerHTML=“xpath是“+xp+”
”; var result=document.evaluate(xp,document,null,XPathResult.ANY_TYPE,null); r、 innerHTML+=“所选节点包含-”+result.iterateNext().innerHTML

废旧物品
无关的
无意义的
这是测试点别看这个



这可能是一个问题,无论你给出什么优雅的答案,我都可以构建一个失败的场景。为每个节点分配ID是可行的,但这很糟糕。为什么需要绝对xpath?也许有一个解决方案你没有。非常感谢你的回答!我害怕听到这个,但我仍然希望会有答案。我有一个页面上所选文本的相对路径(我也有该文本-不是特别有用),我需要用其他文本替换该文本。由于我得到的相对路径并不总是唯一的(我将用示例更新我的问题),document.evaluate函数将计算到同一个节点。非常感谢,但现在我不确定我是否正确解释了我需要什么(我再次更新了问题:))。您建议的函数接受一个节点,然后计算出其xpath。我需要的是在只有相对xpath的情况下获取节点。document.evaluate不会总是返回唯一的节点(例如在给定的示例中)。这就是为什么我认为从给定的相对XPath中获取绝对XPath可能更容易,然后使用document.evaluate。您有XPath相对的节点吗?如果是
您可以执行
document.evaluate(relativePath,document.getElementById('content'),…
我不确定是否可以获得它,但我会查看它。谢谢您的建议!