当前位置: 代码迷 >> JavaScript >> 从另一个 XPath 结果获取 XPath 结果
  详细解决方案

从另一个 XPath 结果获取 XPath 结果

热度:169   发布时间:2023-06-05 14:08:28.0

我似乎根本无法让它发挥作用。 我正在尝试使用 xPath 结果作为我在greasemonkey 脚本中对页面的基本查询。

我正在使用的代码是:

var select=$tag('select');
this.basePath=xpath.single("/html/body/div/div/div/div",document);
// - /html/body/div/div/div/div/div[2]/div/div[2]/div[2]/table/tbody/tr/th[2]/a
if(select.length>0){
    this.location=xpath.single("/div[2]/div/div[2]/div[2]/table/tbody/tr/th[2]/a",this.basePath);
    console.log('location: '+this.location.singleNodeValue.textContent);
}

xPath 函数是:

var xpath=function(){
    return {
    single:function easyXPath(path,baseNode){
        if(baseNode===undefined||!isHTML(baseNode)){
                baseNode=document;
        }
        return document.evaluate(path,baseNode,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
    },
    count:function easyXPathCount(path,baseNode){
        if(baseNode===undefined||!isHTML(baseNode)){
            baseNode=document;
        }
        return document.evaluate("count("+path+")",baseNode,null,XPathResult.NUMBER_TYPE,null).numberValue;
    },
    number:function easyXPathNumber(path,baseNode){
        if(baseNode===undefined||!isHTML(baseNode)){
            baseNode=document;
        }
        return document.evaluate(path,baseNode,null,XPathResult.NUMBER_TYPE,null).numberValue;
    },
    multi:function easyXPathMultiNode(path,baseNode){
        if(baseNode==undefined||!isHTML(baseNode)){
            baseNode=document;
        }
        return document.evaluate(path,baseNode,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
    }
};
}();
function isHTML(node){
    return node instanceof HTMLElement || node instanceof Element;
}

我已经留下了我试图到达的元素的完整路径,最后我只会将基本路径添加到以下路径中

找到了一种方法。 可能不是最有效的,但它有效。

let select=$tag('select');
this.basePath=xpath.single("/html/body/div/div/div/div");
// - /html/body/div/div/div/div/div[2]/div/div[2]/div[2]/table/tbody/tr/th[2]/a
let fragment=document.createDocumentFragment();
let d=this.basePath.singleNodeValue.cloneNode(true);
fragment=fragment.appendChild(d);
if(select.length>0){
    this.location=xpath.single("/div[2]/div/div[2]/div[2]/table/tbody/tr/th[2]/a",fragment);
    console.log('location: '+this.location.singleNodeValue.textContent);
}

似乎 xPath 需要一个文档库才能工作,并且不适用于任何还不是文档类型或文档片段的内容。

希望这也有助于其他人。