У меня проблемы с оценкой XPath с использованием nsIDOMXPathEvaluator из Mozillas XPCOM.Я запускаю следующий код javascript через XPCShell:
[...]
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 представляет собой массив html-документов, проанализированных с использованием do_parse_document из утилит тестирования xpcshell.Верхняя часть всех документов:
<!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
Я ожидаю получить как минимум 1 или 2 результата из путей / html и // html.(Те, которые возвращаются при использовании / node () в качестве пути)
Я не могу получить правильный вывод при выполнении запросов типа count (// p) (тот возвращает 0, хотя в документе много абзацев)).
Я попытался вызвать document.evaluate () вместо xpEval.evaluate () с теми же результатами.Я попытался просто передать null для пространства имен, те же результаты.
Я делаю какую-то глупую ошибку (ошибки), или могут быть некоторые причуды в nsIDOMXPathEvaluator, что означает, что я не могу использовать его так, как я собираюсь?
Спасибо за ваше время!
С уважением, Торин