首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPCOM XPathEvaluator的问题

XPCOM XPathEvaluator的问题
EN

Stack Overflow用户
提问于 2011-01-25 22:26:19
回答 1查看 373关注 0票数 1

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

代码语言: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文档的数组。所有文档的顶部是:

代码语言:javascript
复制
<!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并没有完全返回我所期望的结果。以下是上述代码片段的输出:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-25 22:40:20

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

代码语言:javascript
复制
  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这样的路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4794610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档