解析的XML文档中的XPath出错(WrongDocumentError)

时间:2014-06-11 15:09:12

标签: javascript firefox xpath firefox-addon firefox-addon-sdk

我正在创建一个Firefox for Android扩展程序,我对从XMLHttpRequest检索到的XML文档有疑问:我无法找到选择节点的方法。我找到的更好的解决方案就是这个,但是当我在文档中选择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不是函数"   {file:"资源://gre/modules/addons/XPIProvider.jsm - >   !JAR:文件:///data/data/org.mozilla.fennec/files/mozilla/ggz9zzjr.default/extensions/qrReader@qrReader.xpi /bootstrap.js"   line:61}]

3 个答案:

答案 0 :(得分:1)

嗯,例外的名称WrongDocumentErrort将其弃去了。您尝试在不属于同一文档.evaluate()的DOM(Document)上调用.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); ,您必须使用它。

nsIDOMParser

相反使用XHR,因为您的内容似乎源自XHR.responseType = "document",而且似乎是(X)HTML(由您的表达式表示),使用{{1}可能更好相反,它将使用HTML解析器从响应中解析DOM。

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();

答案 1 :(得分:0)

parseFromString返回一个文档对象。 selectSingleNode不是文档功能。您无法使用标准document.getElementsByClassnamedocument.getElementByIddocument.querySelector选择节点吗?

答案 2 :(得分:0)

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