2011-01-25 3 views
1

Mozilla XPCOMのnsIDOMXPathEvaluatorを使用してXPathを評価する際に問題があります。私はxpcshellを通過、次のJavaScriptコードを実行している:XPCOMの問題XPathEvaluator

[...] 
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-リストは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 

のI/htmlと// HTMLパスから少なくとも1つの又は2の結果を期待します。 (/ node()をパスとして使用したときに返されるもの)

count(// p)のようなクエリを実行すると正しい出力を得ることができません(文書に段落がたくさんありますが、0が返されます)。

xpEval.evaluate()の代わりに同じ結果をdocument.evaluate()を呼び出してみました。私は名前空間、同じ結果のためにnullを渡そうとしました。

私はいくつかの愚かな間違いをしていますか、またはnsIDOMXPathEvaluatorにいくつかの癖があります。それは私がどのように使用することができないのでしょうか?

ありがとうございました!

よろしく、 トゥリン

+0

これは** FAQ **です:接頭辞に一致する要素がない(ヌル(または空の)名前空間URIを伴わない)名前テストです。ここでは、 'http:// www.w3.org/1999/xhtml'名前空間URI(デフォルト名前空間宣言)の下に要素があります。したがって、XPath式評価コンテキストの名前空間URIバインディングにプレフィックスを登録する必要があります。 –

+0

私はあまりにも名前空間での作業に慣れていないので、私はxpEval.createNSResolver()がそれを解決すると思っていました。また、xhtmlとhtmlを使って作業することの違いについては考慮しませんでした.HTMLドキュメントや名前空間接頭辞が使用されていない場合には、 "null"と記述されていました。私はhtmlタグのxmlns部分にもっと注意を払っていたはずですね:)とにかく返事をいただきありがとうございます - あなたが受け入れられた答えを読むことができるように、あなたが言うことはまさに問題でした。 –

答えて

1

は、それはあなたが接頭辞をバインドする必要があります任意の名前空間内の要素を選択するために、XHTML名前空間http://www.w3.org/1999/xhtmlにおよびXPath 1.0で、その場合にはそうである、はdocument.firstChildノードの名前空間URIプロパティをダンプ名前空間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:body/xhtml:h1等パス。

+0

申し訳ありませんが、ありがとう!それは動作します:) –

関連する問題