我正在尝试创建一个应用程序,用户可以在该应用程序中在浏览器中存储注释。
为了找出用户在文档中创建注释的位置,我尝试存储 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()='HTML'和namespace-uri()='http://www.w3.org/1999/xhtml']/[name()='BODY'和namespace- uri()='http://www.w3.org/1999/xhtml'][1]/[name()='P' 和 namespace-uri()='http://www. w3.org/1999/xhtml'][1]/[name()='SPAN' 和 namespace-uri()='http://www.w3.org/1999/xhtml'][4 ]/[name()='SPAN' 和 namespace-uri()='http://www.w3.org/1999/xhtml'][2]/[name()='#text'和命名空间-uri()='未定义'][0]"
但是在 Chrome Inspect Element 中,它给出了一些干净的字符串,如下所示:
//*[@id="tinymce"]/p/span[2]/span[2]/strong
任何人都可以帮我从文档中检索元素的 xpath,然后稍后从 xpath 中找到该元素吗?
如果您能够使用 Saxon-JS,那么您可以使用专门为此目的而设计的 XPath 3.0 函数 fn:path()。