Проблема с XPCOM XPathEvaluator - PullRequest
1 голос
/ 25 января 2011

У меня проблемы с оценкой 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, что означает, что я не могу использовать его так, как я собираюсь?

Спасибо за ваше время!

С уважением, Торин

1 Ответ

1 голос
/ 25 января 2011

Создайте дамп свойства namespaceURI узла document.documentElement, скорее всего, оно находится в пространстве имен XHTML http://www.w3.org/1999/xhtml, и в этом случае с XPath 1.0 для выбора элементов в любом пространстве имен вам необходимо привязать префикс к URI пространства имен и использовать этот префикс. Используя API, который вы используете, вы должны убедиться, что ваш преобразователь пространства имен разрешает выбранный вами префикс в URI пространства имен XHTML. Так что вам нужно, например,

  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.

...