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にいくつかの癖があります。それは私がどのように使用することができないのでしょうか?
ありがとうございました!
よろしく、 トゥリン
これは** FAQ **です:接頭辞に一致する要素がない(ヌル(または空の)名前空間URIを伴わない)名前テストです。ここでは、 'http:// www.w3.org/1999/xhtml'名前空間URI(デフォルト名前空間宣言)の下に要素があります。したがって、XPath式評価コンテキストの名前空間URIバインディングにプレフィックスを登録する必要があります。 –
私はあまりにも名前空間での作業に慣れていないので、私はxpEval.createNSResolver()がそれを解決すると思っていました。また、xhtmlとhtmlを使って作業することの違いについては考慮しませんでした.HTMLドキュメントや名前空間接頭辞が使用されていない場合には、 "null"と記述されていました。私はhtmlタグのxmlns部分にもっと注意を払っていたはずですね:)とにかく返事をいただきありがとうございます - あなたが受け入れられた答えを読むことができるように、あなたが言うことはまさに問題でした。 –