我在使用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中是否存在一些怪癖,这意味着我无法按照我的意图使用它?
谢谢你的时间!
此致 托林
答案 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
等路径。