将XPath转换为Node

时间:2012-02-29 23:11:06

标签: javascript xpath

我想知道如何将XPath转换为Node对象?

我问的原因是因为我正在尝试创建一个Range对象,并使用XPath设置范围。下面是我编写的代码,但根据我的理解,它不起作用因为setRange()和setEnd()需要一个Node对象作为它的第一个参数。

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 '';
  }
}

1 个答案:

答案 0 :(得分:1)

假设您调用“XPath”的内容是XPath查询的结果,则返回DOMNodelist,因此您必须设置

startXPath to XPathResult[0] 

endXPath to XPathResult[XPathResult.length-1]

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


与评论相关的编辑

由于startXPath和endXPath实际上是XPath'es,你需要评估它们以获取节点:

  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);

你能解释一下你想要达到的目标,也许还有更好的方法吗?