我正在创建一个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}]
答案 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.getElementsByClassname
,document.getElementById
或document.querySelector
选择节点吗?
答案 2 :(得分:0)
试
var window = parsedXml.ownerDocument.defaultView;
var res = window.content.document.evaluate(xpathExpression, parsedXml, null, window.XPathResult.STRING_TYPE , null);