我在使用Mozillas XPCOM的nsIDOMXPathEvaluator评估XPaths时遇到了问题。我通过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">我的问题是,我用作输入的XPaths并没有完全返回我所期望的结果。以下是上述代码片段的输出:
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中可能有一些怪癖,这意味着我不能按照我想要的方式使用它?
耽误您时间,实在对不起!
致以问候,Torin
发布于 2011-01-25 22:40:20
转储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这样的路径。
https://stackoverflow.com/questions/4794610
复制相似问题