Javascript 解析的XML文档中的XPath错误(错误文档错误)

Javascript 解析的XML文档中的XPath错误(错误文档错误),javascript,firefox,xpath,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Xpath,Firefox Addon,Firefox Addon Sdk,我正在为Android创建Firefox扩展,但从XMLHttpRequest检索的XML文档有问题:我找不到选择节点的方法。我找到的更好的解决方案是这样的,但在文档上选择with xpath时出现了以下错误: WrongDocumentError: Node cannot be used in a document other than the one in which it was created 这是我的代码: var parser = Cc["@mozilla.org/xmlextra

我正在为Android创建Firefox扩展,但从
XMLHttpRequest
检索的XML文档有问题:我找不到选择节点的方法。我找到的更好的解决方案是这样的,但在文档上选择with xpath时出现了以下错误:

WrongDocumentError: Node cannot be used in a document other than the one in which it was created
这是我的代码:

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser); 
var parsedXml = parser.parseFromString(xmlhttp.responseText, "text/xml");    
var xpathExpression = "//td[contains(.,'Raw text')]/../td[2]/pre"; 

var res = window.content.document.evaluate(xpathExpression, parsedXml, null, window.XPathResult.STRING_TYPE , null);
如果我将“评估”替换为下一行:

var res = parsedXml.selectSingleNode(xpathExpression);
然后我得到以下错误:

[JavaScript错误:“parsedXml.selectSingleNode不是函数” {文件:resource://gre/modules/addons/XPIProvider.jsm -> 罐子:file:///data/data/org.mozilla.fennec/files/mozilla/ggz9zzjr.default/extensions/qrReader@qrReader.xpi!/bootstrap.js“ 行:61}]


parseFromString
返回文档对象
selectSingleNode
不是文档功能。您不能使用标准的
文档.getElementsByCassName
文档.getElementById
文档.querySelector
选择节点吗?

试试看

var window = parsedXml.ownerDocument.defaultView;
var res = window.content.document.evaluate(xpathExpression, parsedXml, null, window.XPathResult.STRING_TYPE , null);

嗯,异常的名称,
ErrorDocumentErrort
泄露了它。您试图在不属于同一文档的DOM(
文档
)上调用
.evaluate()
。evaluate()已绑定到

nsIDOMParser
实际上将返回一个新的
XMLDocument
,它本身有一个
.evaluate()
,您必须使用它

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
             createInstance(Ci.nsIDOMParser); 
var parsedDoc = parser.parseFromString(
  '<?xml version="1.0"?>\n<doc><elem>Raw text</elem></doc>',
  "text/xml");    
var xpathExpression = "//elem[contains(.,'Raw text')]"; 

var res = parsedDoc.evaluate(
  xpathExpression,
  parsedDoc,
  null,
  XPathResult.STRING_TYPE,
  null);
console.log(res, res.stringValue);
var req = new XMLHttpRequest();
req.onload = function() {
  var doc = req.response;
  var h1 = doc.evaluate("//h1", doc, null, XPathResult.STRING_TYPE, null);
  console.log(h1.stringValue);

  // Alternative in some cases
  h1 = doc.querySelector("h1");
  console.log(h1.textContent);
};
req.open("GET", "http://example.org/");
req.responseType = "document"; // Parse as text/html
req.send();