XPCOM XPathEvaluator遇到麻烦

时间:2011-01-25 14:26:19

标签: javascript xpath xpcom xpcshell

我在使用Mozillas XPCOM中的nsIDOMXPathEvaluator评估XPath时遇到问题。我通过XPCShell运行以下javascript代码:

[...]  
var myPaths = new Array();  
myPaths[0] = "/";
myPaths[1] = "/node()";  
myPaths[2] = "/html";   

for(i in myPaths) {  
    myPath = myPaths[i];  
    var document = doms[0];  
    var xpEval = Components.classes["@mozilla.org/dom/xpath-evaluator;1"].createInstance(Components.interfaces.nsIDOMXPathEvaluator);  
    var ns = xpEval.createNSResolver(document.documentElement);  
    var type =  Components.interfaces.nsIDOMXPathResult.UNORDERED_NODE_SNAPSHOT_TYPE;  

    var res = xpEval.evaluate(myPath, document.documentElement, ns, type, null);  
    dump("\nPath: "+myPath+"\n");  
    dump("Result length: "+res.snapshotLength+"\n");  
    for ( var i=0 ; i < res.snapshotLength; i++ )  
        dump("... Node: "+res.snapshotItem(i)+"\n"); 
        dump("... ... .nodeName: "+res.snapshotItem(i).nodeName+"\n");  
}  
[...]  

doms-list是一个使用xpcshell测试实用程序中的do_parse_document解析的html文档数组。所有文件的顶部是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">

我的麻烦是我用作输入的XPath并没有完全恢复我的期望。以下是上述代码段的输出:

Path: /
Result length: 1
... Node: [object XMLDocument]
... ... .nodeName: #document


Path: /node()
Result length: 2
... Node: [object DocumentType]
... ... .nodeName: html
... Node: [object HTMLHtmlElement]
... ... .nodeName: html

Path: /html
Result length: 0

Path: //html
Result length: 0

我希望/ html和// html路径至少有1或2个结果。 (使用/ node()作为路径时返回的那些)

在执行count(// p)之类的查询时,我无法得到正确的输出(尽管文档中有很多段落,但是返回0)。

我尝试使用相同的结果调用document.evaluate()而不是xpEval.evaluate()。我试过为命名空间传递null,结果相同。

我是否犯了一些愚蠢的错误,或者nsIDOMXPathEvaluator中是否存在一些怪癖,这意味着我无法按照我的意图使用它?

谢谢你的时间!

此致 托林

1 个答案:

答案 0 :(得分:1)

转储document.documentElement节点的namespaceURI属性,它可能在XHTML名称空间http://www.w3.org/1999/xhtml中,并且在这种情况下使用XPath 1.0来选择任何名称空间中的元素,您需要将前缀绑定到名称空间URI和使用该前缀。使用您使用的API,您必须确保命名空间解析器将您选择的前缀解析为XHTML命名空间URI。所以你需要例如。

  var nsResolver = function (prefix) { if (prefix === 'xhtml') return 'http://www.w3.org/1999/xhtml'; else return null; };
  var res = xpEval.evaluate(myPath, document, nsResolver, type, null); 

然后是/xhtml:html/xhtml:html/xhtml:body/xhtml:h1等路径。