我正在创建 Android 版 Firefox 扩展,但从 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 Error: "parsedXml.selectSingleNode is not a function" {file: "resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///data/data/org.mozilla.fennec/files/mozilla/ggz9zzjr.default/extensions/qrReader@qrReader.xpi!/bootstrap.js" line: 61}]
最佳答案
嗯,异常的名称 WrongDocumentErrort
泄露了它。您尝试在不属于同一文档 .evaluate()
的 DOM (Document
) 上调用 .evaluate()
绑定(bind)到。
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
,并且似乎是(X)HTML(由您的表达式指示),所以它可能是最好使用 XHR.responseType = "document"
来代替,它将使用 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();
关于javascript - 解析的 XML 文档中的 XPath 错误 (WrongDocumentError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166459/