Javascript 将XPath转换为节点

Javascript 将XPath转换为节点,javascript,xpath,Javascript,Xpath,我想知道如何将XPath转换为节点对象 我之所以问这个问题,是因为我试图创建一个范围对象,并用XPath设置范围。下面是我编写的代码,但据我所知,它不起作用,因为setRange()和setEnd()需要一个节点对象作为其第一个参数 var range = document.createRange(); range.setStart(startXPath, startOffset); range.setEnd(endXPath, endOffset); 编辑:这就是我获取XPath的方式: f

我想知道如何将XPath转换为节点对象

我之所以问这个问题,是因为我试图创建一个范围对象,并用XPath设置范围。下面是我编写的代码,但据我所知,它不起作用,因为setRange()和setEnd()需要一个节点对象作为其第一个参数

var range = document.createRange();
range.setStart(startXPath, startOffset);
range.setEnd(endXPath, endOffset);
编辑:这就是我获取XPath的方式:

function grabSelection() {
    var selection = window.getSelection();
    var range = selection.getRangeAt(0);

    var selectObj = {
        'startXPath': makeXPath(range.startContainer), 
        'startOffset': range.startOffset, 
        'endXPath': makeXPath(range.endContainer), 
        'endOffset': range.endOffset 
   }

   return selectObj
}


function makeXPath (node, currentPath) {
  currentPath = currentPath || '';
  switch (node.nodeType) {
    case 3:
    case 4:
      return makeXPath(node.parentNode, 'text()[' + (document.evaluate('preceding-sibling::text()', node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']');
    case 1:
      return makeXPath(node.parentNode, node.nodeName + '[' + (document.evaluate('preceding-sibling::' + node.nodeName, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']' + (currentPath ? '/' + currentPath : ''));
    case 9:
      return '/' + currentPath;
    default:
      return '';
  }
}

假设您称为“XPath”的东西是XPath查询的结果,这将返回一个DOMNodelist,因此您必须设置

startXPath to XPathResult[0] 

(其中XPathResult是XPath->query返回的节点列表)


编辑与评论相关的内容 由于startXPath和endXPath实际上是XPath,因此需要对它们进行求值以获得节点:

  var startXPath = document.evaluate(startXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
  var endXPath = document.evaluate(endXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);

您能否解释一下您试图实现的目标,也许有更好的方法?

使用XPath API选择所需的节点(),然后将它们传递给
setStart
setEnd
。对不起,我有点迷路了。我知道XPathResult[0]代表列表中的第一个元素,因此是开始。我不明白你所说的“XPath->query”是什么意思。查询是方法吗?将其理解为返回列表的方法的同义词。更具体地说,我需要知道如何获得XPathResult(resultType很重要),我在文章的编辑部分发布了如何获得XPathResult。
  var startXPath = document.evaluate(startXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
  var endXPath = document.evaluate(endXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);